检查约束条件
Check constraint with condition
我想知道这个条件是否可以通过检查约束来完成,或者我是否需要创建触发器。
条件:如果学生入学日期不为空则考试分数为空
备注:Constaint case OR Trigger
我试过的:
ALTER TABLE ADMITED_TABLE
ADD CONSTRAINT AAAA CHECK
( CASE WHEN DATEADMITED IS NOT NULL THEN MARK NULL END);
错误:
ORA-00920: invalid relational operator
00920. 00000 - "invalid relational operator"
检查约束采用布尔条件,因此您必须以这种条件的形式构建此逻辑:
ALTER TABLE ADMITED_TABLE
ADD CONSTRAINT AAAA CHECK
(dateadmited IS NULL OR mark IS NULL);
从问题的描述看来,你想要的是触发器,而不是约束。约束使您可以验证 table 中的值是否符合您的预期;但是,约束不能更改列的值。因此,如果您只是想验证提供的值是否符合您的规则,则 CHECK 约束就足够了。如果您想(可能)更改 MARK 列的值,您需要使用触发器,例如:
CREATE OR REPLACE ADMITED_TABLE_BIU
BEFORE INSERT OR UPDATE ON ADMITED_TABLE
FOR EACH ROW
BEGIN
IF :NEW.DATEADMITED IS NOT NULL THEN
:NEW.MARK := NULL;
END IF;
END ADMITED_TABLE_BIU;
祝你好运。
我一定是误读了大卫的要求,因为我的解决方案是:
ALTER TABLE admitted_table
ADD CONSTRAINT aaaa CHECK
( (dateadmitted IS NOT NULL
AND mark IS NULL)
OR dateadmitted IS NULL);
以下是我的测试用例:
-- Succeeds
INSERT INTO admitted_table (
dateadmitted, mark
)
VALUES (SYSDATE, NULL);
-- Fails due to check constraint
INSERT INTO admitted_table (
dateadmitted, mark
)
VALUES (SYSDATE, 10);
-- Succeeds
INSERT INTO admitted_table (
dateadmitted, mark
)
VALUES (NULL, 99);
我想知道这个条件是否可以通过检查约束来完成,或者我是否需要创建触发器。
条件:如果学生入学日期不为空则考试分数为空
备注:Constaint case OR Trigger
我试过的:
ALTER TABLE ADMITED_TABLE
ADD CONSTRAINT AAAA CHECK
( CASE WHEN DATEADMITED IS NOT NULL THEN MARK NULL END);
错误:
ORA-00920: invalid relational operator
00920. 00000 - "invalid relational operator"
检查约束采用布尔条件,因此您必须以这种条件的形式构建此逻辑:
ALTER TABLE ADMITED_TABLE
ADD CONSTRAINT AAAA CHECK
(dateadmited IS NULL OR mark IS NULL);
从问题的描述看来,你想要的是触发器,而不是约束。约束使您可以验证 table 中的值是否符合您的预期;但是,约束不能更改列的值。因此,如果您只是想验证提供的值是否符合您的规则,则 CHECK 约束就足够了。如果您想(可能)更改 MARK 列的值,您需要使用触发器,例如:
CREATE OR REPLACE ADMITED_TABLE_BIU
BEFORE INSERT OR UPDATE ON ADMITED_TABLE
FOR EACH ROW
BEGIN
IF :NEW.DATEADMITED IS NOT NULL THEN
:NEW.MARK := NULL;
END IF;
END ADMITED_TABLE_BIU;
祝你好运。
我一定是误读了大卫的要求,因为我的解决方案是:
ALTER TABLE admitted_table
ADD CONSTRAINT aaaa CHECK
( (dateadmitted IS NOT NULL
AND mark IS NULL)
OR dateadmitted IS NULL);
以下是我的测试用例:
-- Succeeds
INSERT INTO admitted_table (
dateadmitted, mark
)
VALUES (SYSDATE, NULL);
-- Fails due to check constraint
INSERT INTO admitted_table (
dateadmitted, mark
)
VALUES (SYSDATE, 10);
-- Succeeds
INSERT INTO admitted_table (
dateadmitted, mark
)
VALUES (NULL, 99);