Oracle 12c - 列检查约束不能引用其他列

use*_*ser 1 sql oracle oracle12c

我必须修改我的表格,并尝试按以下方式进行:

ALTER TABLE projects
    MODIFY (
        id_proj NUMBER(4) CONSTRAINT pk_proj PRIMARY KEY,
        desc VARCHAR2(40) NOT NULL CONSTRAINT uk_proj UNIQUE,
        end_date CONSTRAINT chk_date CHECK(end_date > start_date),
        fund CHECK (fund > 0)
    );
Run Code Online (Sandbox Code Playgroud)

当我尝试执行此查询时,出现错误:

ORA-02438:列检查约束不能引用其他列
02438。00000 - “列检查约束不能引用其他列”
*原因:试图定义引用另一列的列检查约束。
*Action:将其定义为表检查约束。

此外,我希望该列接受大于 0 或 NULL 值的值。

Gor*_*off 5

这只是一个语法怪癖。做这个:

ALTER TABLE projects
    MODIFY (
        id_proj NUMBER(4) CONSTRAINT pk_proj PRIMARY KEY,
        desc VARCHAR2(40) NOT NULL CONSTRAINT uk_proj UNIQUE,
        end_date DATE,  -- I'm guessing this is the type
        CONSTRAINT chk_date CHECK (end_date > start_date),
        fund CHECK (fund > 0)
    );
Run Code Online (Sandbox Code Playgroud)

正如错误所暗示的那样,您不能拥有引用其他列的内联检查约束。你仍然可以有一个检查约束;它只需要自己声明为约束。

在我们评论时:

  • desc对于列来说是一个非常糟糕的名称,因为它是一个 SQL 关键字。使用descr或拼写整个内容,description.
  • CONSTRAINT uk_proj UNIQUE对我来说似乎很冗长。它可以用一个简单的UNIQUE. 诚然,这不允许您命名唯一约束。这对您的数据库很重要吗?
  • 主键约束也是如此。(如果你有理由给它们命名,那就保持原样;我只是不经常找到这样的理由。)