【问题标题】:Oracle Column Constraint on char(4) field to not accept insert of 3 char valuechar(4) 字段上的 Oracle 列约束不接受插入 3 个字符值
【发布时间】:2015-03-17 15:33:50
【问题描述】:

我们的问题是我们的 XLS 在“文本”字段中有例如“0112”

然后有人将这张表(不确定是否复制/粘贴)转移到另一个电子表格中,他们丢失了 0,并且 CSV 有“112”(很难看到,但 112 后面有一个空格)

然后一些 java 代码读取 csv 并将值插入数据库表 (Oracle 11g) 并且该字段是 char(4) 类型,因此它似乎在末尾附加了一个空格,我们最终得到 '112'。

是否有某种方法可以向 Oracle 表/列添加一些约束以不自动填充或添加额外空间,我们希望在尝试将 112 插入 char(4) 时收到一些错误

【问题讨论】:

  • 检查约束 char_length(col) = 4? (char_length 或类似。)
  • 可能是一个触发器,尽管可能是 :new.YourColumn 已在触发器中填充。
  • CHAR 数据类型的规范是它总是用空格填充到指定的长度。基本上没有理由更喜欢CHAR(x) 而不是VARCHAR2(x),而且有很多理由更喜欢VARCHAR2。您可以对检查长度的VARCHAR2 施加约束这一事实就是其中之一。将列更改为VARCHAR2 是一个选项吗?
  • @JustinCave 作为更改字段类型的选项不太可能,因为我们公司的官僚作风相当分层

标签: sql database oracle11g constraints


【解决方案1】:

你总是可以尝试添加一个约束来检查你的字符串的长度是否为 4,在去掉任何空格之后:

create table test1 (col1 char(4));

alter table test1 add constraint t1_chk check (length(trim(col1)) = 4);

-- the following inserts ok
insert into test1 values ('1234');

-- the following fails
insert into test1 values ('112 ');

commit;

【讨论】:

  • 我喜欢这样,让我在我们的团队中飞行,看看他们有什么想法
  • 我不一定认为这是最好的做法,这只是一种可能性。更好的是清理您的文件进程(将文件传输到数据库的步骤如此之多;真的有必要吗?)。和CHAR? {shudders} 制作那个 VARCHAR2,正如之前的 cmets 关于你的问题已经提到的那样。
  • 似乎 SQLFiddle 有一些错误...sqlfiddle.com/#!4/7acb9/1 我在那里测试了这个,如果我把它全部放在构建模式中,它会按你期望的那样工作,但是如果我把 create & alter 放在模式中并且插入到运行 SQL 区域会引发错误 ORA-00900: invalid SQL statement... 我在我们的 Oracle 11g R2 上进行了相同的测试,它工作正常
  • 我认为您需要将插入内容放在左侧并构建架构。我认为右侧面板不接受插入语句。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 2020-12-01
相关资源
最近更新 更多