假设我有一个
table User(userid, usernama)
和 a
table Owner(ownerid, ownername)
和 join
table UserOwnerMapping(userid, ownerid, IS_MASTER)
,在用户和所有者之间创建多对多
is_master 默认为“N”。一个用户只能有一个主人。
如何使用约束来强制一个用户不超过一个主控?
我正在使用甲骨文。
您可以使用唯一的基于函数的索引来实现约束:
create unique index idx on userownermapping
(case when is_master='Y' then userid end);
这只会在 is_master = 'Y' 时索引用户 ID,因此当 is_master = 'Y' 时强制用户 ID 唯一,否则不会:
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
使userid
列唯一可以解决问题。为什么需要is_master
?
你的意思是ownerid
可以null
在UserOwnerMapping
?
您需要在 UserOwnerMapping 表上创建一个预插入触发器。这需要检查该 userid/ownerid 组合是否存在 IS_MASTER = Y 行。