假设我有一个
table User(userid, usernama)
和a
table Owner(ownerid, ownername)
和加入
table UserOwnerMapping(userid, ownerid, IS_MASTER)
这会在用户和所有者之间创建多对多
is_master默认为'N'。用户只能拥有一个主人。
如何使用约束强制不超过一个主控 对于用户?
我正在使用Oracle。
答案 0 :(得分:4)
您可以使用基于函数的唯一索引来实现约束:
create unique index idx on userownermapping
(case when is_master='Y' then userid end);
这只会在is_master ='Y'时索引用户ID,因此当is_master ='Y'时强制userid是唯一的,否则不是:
SQL> create table UserOwnerMapping (userid integer, ownerid integer, IS_MASTER varchar2(1));
Table created.
SQL>
SQL> create unique index idx on userownermapping
2 (case when is_master='Y' then userid end);
Index created.
SQL>
SQL> insert into UserOwnerMapping (userid, ownerid, IS_MASTER) values (1, 2, 'Y');
1 row created.
SQL>
SQL> insert into UserOwnerMapping (userid, ownerid, IS_MASTER) values (1, 3, 'N');
1 row created.
SQL>
SQL> insert into UserOwnerMapping (userid, ownerid, IS_MASTER) values (1, 4, 'N');
1 row created.
SQL>
SQL> insert into UserOwnerMapping (userid, ownerid, IS_MASTER) values (1, 5, 'Y');
insert into UserOwnerMapping (userid, ownerid, IS_MASTER) values (1, 5, 'Y')
*
ERROR at line 1:
ORA-00001: unique constraint (MYSCHEMA.IDX) violated
答案 1 :(得分:0)
使userid
列唯一可以解决问题。你为什么需要is_master
?
您的意思是ownerid
null
中UserOwnerMapping
可以是{{1}}吗?
答案 2 :(得分:0)
您需要在UserOwnerMapping表上创建一个预插入触发器。 这需要检查该userid / ownerid组合是否存在IS_MASTER = Y行。