Oracle SQL Developer与Oracle 11g Express Edition中的检查约束存在问题。
我想检查存储为CHAR
的邮政编码是否仅包含数字而不包含其他符号。
尝试了各种可能性但没有任何效果......
PLZ VARCHAR(5) NOT NULL
ADD CONSTRAINT TC_PLZ CHECK (PLZ LIKE '[0-9][0-9][0-9][0-9][0-9]')
谢谢和最诚挚的问候,
迈克尔
答案 0 :(得分:4)
使用regexp_like()
:
ADD CONSTRAINT TC_PLZ CHECK ( regexp_like(PLZ, '^[0-9]{5}$') )
Oracle - 与大多数数据库一样 - 仅支持LIKE
中的ANSI标准通配符。对于零个或多个字符,这些字符为%
,而对于一个字符,这些字符为_
。
正则表达式更强大(虽然通常较慢)。
这可能会更有效:
ADD CONSTRAINT TC_PLZ CHECK (translate(PLZ, '0123456789', '000000000') = '00000')
虽然为了清晰起见,我会使用正则表达式。
答案 1 :(得分:2)
如果要使用正则表达式模式,则需要在CHECK约束中使用正则表达式函数。这将有效:
create table t23 (
PLZ VARCHAR(5) NOT NULL
, CONSTRAINT TC_PLZ CHECK (regexp_LIKE(plz, '^[0-9]{5}$'))
);
虽然不需要正则表达式;这是另一种实现方式:
create table t42 (
PLZ NUMBER(5,0) NOT NULL
, CONSTRAINT T42_PLZ CHECK (length(plz)=5)
);
使用正确的数据类型存储数值是一种很好的做法。
正如@ MT0指出的那样,如果有效值可以从前导零开始,则数字实现不正确。我的纯粹数据建模器角色声明必须是固定位数的值应从10000
开始(对于五位数值)。但是,我必须承认我知道一个系统确实允许在数字"数字中使用前导零。领域;他们通过允许变量级别值来加剧这一点,这意味着代码0300
识别出与00300
不同的东西。什么百灵!