“CREATE TABLE”中的正则表达式

Ole*_*kyi 0 regex sql oracle oracle-sqldeveloper

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

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

该脚本运行良好,正在创建表。但是下面的 INSERT 语句

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

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

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

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

提前致谢

Gor*_*off 6

我的猜测是问题是空格。 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]*$'))
);
Run Code Online (Sandbox Code Playgroud)

我还可以添加一些注释:

  • 在这种情况下,我非常喜欢主键clientIdor client_id,而不是通用的id。这允许大多数外键引用使用完全相同的名称。
  • 对于名字来说 10 个字符太短了。