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

时间:2017-06-24 20:16:03

标签: 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)
    );

当我尝试执行此查询时,我收到错误:

  

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

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

1 个答案:

答案 0 :(得分:2)

这只是一种语法怪癖。这样做:

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)
    );

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

我们正在发表评论:

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