猜测你的表结构:
SQL小提琴
Oracle 11g R2 模式设置:
CREATE TABLE PEOPLE(
M_CODE NUMBER(20,0) CONSTRAINT PEOPLE__M_CODE__PK PRIMARY KEY
);
CREATE TABLE PMT_TRN_FAMILY (
M_CODE NUMBER(20,0) CONSTRAINT FAMILY__M_CODE__FK
REFERENCES PEOPLE ( M_CODE ),
RELATIONS VARCHAR2(20),
RELATED_TO NUMBER(20,0) CONSTRAINT FAMILY__RELATED_TO__FK
REFERENCES PEOPLE ( M_CODE )
);
然后我们可以修改它,添加一个唯一索引,检查每个索引RELATIONS='SPOUSE'
只有一个M_CODE
:
CREATE UNIQUE INDEX FAMILY__ONE_SPOUSE__U ON PMT_TRN_FAMILY (
CASE RELATIONS WHEN 'SPOUSE' THEN M_CODE END
);
插入一些测试数据:
INSERT INTO PEOPLE ( M_CODE )
SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 7;
INSERT INTO PMT_TRN_FAMILY ( M_CODE, RELATIONS, RELATED_TO )
SELECT 1, 'SPOUSE', 2 FROM DUAL UNION ALL
SELECT 1, 'PARENT', 3 FROM DUAL UNION ALL
SELECT 1, 'PARENT', 4 FROM DUAL UNION ALL
SELECT 1, 'SIBLING', 4 FROM DUAL UNION ALL
SELECT 1, 'CHILD', 5 FROM DUAL UNION ALL
SELECT 1, 'CHILD', 6 FROM DUAL;
查询 1:
SELECT * FROM PMT_TRN_FAMILY
结果:
| M_CODE | RELATIONS | RELATED_TO |
|--------|-----------|------------|
| 1 | SPOUSE | 2 |
| 1 | PARENT | 3 |
| 1 | PARENT | 4 |
| 1 | SIBLING | 4 |
| 1 | CHILD | 5 |
| 1 | CHILD | 6 |
然后有多个父母/孩子(甚至有多个非配偶关系的人),但只有一个配偶。
查询 2:
INSERT INTO PMT_TRN_FAMILY ( M_CODE, RELATIONS, RELATED_TO )
VALUES ( 1, 'SPOUSE', 7 )
结果:
尝试添加第二个配偶,然后您会收到“一个配偶被侵犯”的错误:
ORA-00001: unique constraint (USER_4_2700A6.FAMILY__ONE_SPOUSE__U) violated