3

假设我有一个

table User(userid, usernama)和 a table Owner(ownerid, ownername)和 join table UserOwnerMapping(userid, ownerid, IS_MASTER) ,在用户和所有者之间创建多对多

is_master 默认为“N”。一个用户只能有一个主人。

如何使用约束来强制一个用户不超过一个主控?

我正在使用甲骨文。

4

3 回答 3

4

您可以使用唯一的基于函数的索引来实现约束:

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
于 2012-07-18T11:09:42.143 回答
0

使userid列唯一可以解决问题。为什么需要is_master

你的意思是ownerid可以nullUserOwnerMapping

于 2012-07-18T10:08:41.807 回答
0

您需要在 UserOwnerMapping 表上创建一个预插入触发器。这需要检查该 userid/ownerid 组合是否存在 IS_MASTER = Y 行。

于 2012-07-18T10:45:32.043 回答