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 值的值。
这只是一个语法怪癖。做这个:
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. 诚然,这不允许您命名唯一约束。这对您的数据库很重要吗?