【问题标题】:Add check constraint to column to only allow alphabetical values to entered into the row向列添加检查约束以仅允许在行中输入字母值
【发布时间】:2018-02-15 09:08:07
【问题描述】:

我正在创建一个表,并希望将检查约束添加到其中的两列,以便只能将字母值插入到列中。这是正在创建的表:

CREATE TABLE PERSON
    (
    Forename VARCHAR(30) NOT NULL,
    Surname VARCHAR(30) NOT NULL
    );

名字和姓氏列应该只允许插入字母值。我已经尝试了这两种不同的检查约束,但是它们不起作用,因为我仍然可以将数字值插入到名字列中:

CONSTRAINT FN_LETTERS_ONLY_CK CHECK(FORENAME NOT LIKE ‘%’ +’[^A-Z]’+’%’),
CONSTRAINT FN_LETTERS_ONLY CHECK(REGEXP_LIKE(FORENAME, ‘^[[:ALPHA:]]+$’))

【问题讨论】:

  • “没有用”并不是很有帮助。你真的对这些字符串使用了大引号吗?和大写ALPHA 而不是alpha 在第二个?两者都会导致错误,而不是允许插入数字。但是第二个应该可以正常工作。
  • 是的,我的意思是没有工作是约束不会被应用并且数字仍然会被插入到这些列中而不会引发错误。关于大写字母 ALPHA,我是 SQL 新手,认为大小写无关紧要,所以感谢您告诉我区分大小写。

标签: oracle check-constraints


【解决方案1】:

你的正则表达式尝试看起来几乎是正确的,除了你有大写的 ALPHA 这会导致插入错误(ORA-12729:正则表达式中的无效字符类),并且你用花括号显示它可以防止它完全被创造出来了。

CREATE TABLE PERSON
    (
    Forename VARCHAR(30) NOT NULL,
    Surname VARCHAR(30) NOT NULL,
    CONSTRAINT FN_LETTERS_ONLY CHECK(REGEXP_LIKE(FORENAME, '^[[:alpha:]]+$')),
    CONSTRAINT SN_LETTERS_ONLY CHECK(REGEXP_LIKE(SURNAME, '^[[:alpha:]]+$'))
);

然后测试:

SQL> insert into person values ('abc','xyz');

1 row created.

SQL> insert into person values ('ab1c','xyz');
insert into person values ('ab1c','xyz')
*
ERROR at line 1:
ORA-02290: check constraint (MY_SCHEMA.FN_LETTERS_ONLY) violated


SQL> insert into person values ('abc','xy2z');
insert into person values ('abc','xy2z')
*
ERROR at line 1:
ORA-02290: check constraint (MY_SCHEMA.SN_LETTERS_ONLY) violated

【讨论】:

    猜你喜欢
    • 2016-02-22
    • 1970-01-01
    • 2020-10-24
    • 2018-03-26
    • 2020-04-25
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多