Sql 检查具有多列的约束

Sql 检查具有多列的约束,sql,database,oracle,Sql,Database,Oracle,我有一张桌子 CREATE TABLE DEPENDANT (DEPENDANT_NM VARCHAR2(15) PRIMARY KEY, DEP_GENDER CHAR(1), DEP_BDAT DATE, RELATED_HOW VARCHAR2 (8), ESSNO CHAR(9)); ALTER TABLE DEPENDANT ADD CONSTRAINT FK_ESSNO FOREIGN KEY (ESSNO) REFERENCES HW_EMPLOYEE(SSNO); ALTE

我有一张桌子

CREATE TABLE DEPENDANT (DEPENDANT_NM VARCHAR2(15) PRIMARY KEY,
  DEP_GENDER CHAR(1), DEP_BDAT DATE, RELATED_HOW VARCHAR2 (8), ESSNO CHAR(9));
ALTER TABLE DEPENDANT ADD CONSTRAINT FK_ESSNO FOREIGN KEY (ESSNO)
 REFERENCES HW_EMPLOYEE(SSNO);
ALTER TABLE DEPENDANT ADD CONSTRAINT CK_DEP_GENDER CHECK
(DEP_GENDER IN ('M','F'));
我需要添加一个约束,确保女性受抚养人只能作为“女儿”或“配偶”与男性受抚养人或仅作为“儿子”或“配偶”进行不动产

我是否使用检查约束,如

ALTER TABLE DEPENDANT ADD CONSTRAINT CK_RELATEDF CHECK (DEP_GENDER = 'F' AND 
RELATED_HOW IN('Daughter' OR 'Spouse'));

你必须这样写:

ALTER TABLE DEPENDANT 
    ADD CONSTRAINT CK_RELATEDF 
        CHECK (DEP_GENDER = 'F' AND RELATED_HOW IN ('Daughter', 'Spouse'));

编辑:您必须在一次检查中完成:

ALTER TABLE DEPENDANT ADD CONSTRAINT CK_RELATEDF
  CHECK ((DEP_GENDER = 'F' AND RELATED_HOW IN ('Daughter', 'Spouse'))
    OR (DEP_GENDER = 'M' AND RELATED_HOW IN ('Son', 'Spouse')));

你必须这样写:

ALTER TABLE DEPENDANT 
    ADD CONSTRAINT CK_RELATEDF 
        CHECK (DEP_GENDER = 'F' AND RELATED_HOW IN ('Daughter', 'Spouse'));

编辑:您必须在一次检查中完成:

ALTER TABLE DEPENDANT ADD CONSTRAINT CK_RELATEDF
  CHECK ((DEP_GENDER = 'F' AND RELATED_HOW IN ('Daughter', 'Spouse'))
    OR (DEP_GENDER = 'M' AND RELATED_HOW IN ('Son', 'Spouse')));

“你必须一次完成”

我对这个断言很感兴趣(没有双关语的意思)

在我看来,四个约束不仅是可能的,而且是可取的(以提供更高的故障消息粒度),例如


“你必须一次完成”

我对这个断言很感兴趣(没有双关语的意思)

在我看来,四个约束不仅是可能的,而且是可取的(以提供更高的故障消息粒度),例如


好吧,那么我就对男性做一个几乎相同的约束,对吗?@user1873736你必须在一次检查中完成,我编辑了我的答案。“你必须在一次检查中完成”——你为什么这么说?看看我的答案。好吧,那我就对男性做一个几乎相同的限制,对吗?@user1873736你必须在一次检查中完成,我编辑了我的答案。“你必须在一次检查中完成”——你为什么这么说?看我的答案。阅读作者的评论——他问他是否应该为
dep_gender='M'
添加额外的触发器。如果他这样做了,他将得到两个不允许将任何记录插入表中的检查。这就是为什么我说他必须在一次检查中完成,而不是在两次检查中完成+1对于这些检查。阅读作者的评论-他问是否应该为
dep_gender='M'
添加额外的触发器。如果他这样做了,他将得到两个不允许将任何记录插入表中的检查。这就是为什么我说他必须在一次检查中完成,而不是在两次检查中完成+这些支票我付1英镑。