首页 > 解决方案 > “CREATE TABLE”中的正则表达式

问题描述

我有以下问题:我想用他的 id 和 name 创建一个表 Client。我还想检查名称字段是否仅包含字母。这是我的查询:

CREATE TABLE CLIENT(
ID NUMBER PRIMARY KEY, 
FIRST_NAME CHAR(10) CONSTRAINT NAME_CHECK CHECK(REGEXP_LIKE(FIRST_NAME, '^[A-Za-z]*$'))
);

该脚本工作正常,正在创建表。但是下面的 INSERT 语句

INSERT INTO CLIENT VALUES(1, 'BOB');

不起作用。这是错误文本:

INSERT INTO CLIENT
VALUES(1, 'BOB')
Error report -
ORA-02290: check constraint (TASK8.NAME_CHECK) violated

我确信这个错误的原因很明显,但我就是不明白。我以前从未遇到过正则表达式的问题。

提前致谢

标签: sqlregexoracleoracle-sqldeveloper

解决方案


我的猜测是问题是空格。 CHAR()数据类型会自动用空格填充到长度。

出于这个原因,可变长度字符串比固定长度字符串更常用。在 Oracle 中,这将是一种VARCHAR2()类型:

CREATE TABLE CLIENT (
    ID NUMBER PRIMARY KEY, 
    FIRST_NAME VARCHAR2(10) CONSTRAINT NAME_CHECK CHECK (REGEXP_LIKE(FIRST_NAME, '^[A-Za-z]*$'))
);

我可以添加更多注释:

  • 在这种情况下,我是主键的忠实粉丝clientIdclient_id而不是通用的id. 这允许大多数外键引用使用完全相同的名称。
  • 10 个字符对于名字来说太短了。

推荐阅读