假设我有一个一个Oracle检查约束
table User(userid, usernama)
和 table Owner(ownerid, ownername)
和创建多到许多用户和所有者之间
的is_master默认为“N”的接 table UserOwnerMapping(userid, ownerid, IS_MASTER)
。用户只能有一个主人。
我如何使用约束强制给用户不超过一个主人 ?
我正在使用Oracle。
假设我有一个一个Oracle检查约束
table User(userid, usernama)
和 table Owner(ownerid, ownername)
和创建多到许多用户和所有者之间
的is_master默认为“N”的接 table UserOwnerMapping(userid, ownerid, IS_MASTER)
。用户只能有一个主人。
我如何使用约束强制给用户不超过一个主人 ?
我正在使用Oracle。
可以使用一个独特的基于函数的索引实现的约束:
create unique index idx on userownermapping
(case when is_master='Y' then userid end);
这只会索引的用户ID时is_master =“Y”,所以势力用户ID是唯一的,当is_master =“Y”,但没有其他:
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
?
用户有很多车主,只有一个是它的主用户ID OWNERID已经被设置为PK – 2012-07-18 10:14:12
您将需要在您的UserOwnerMapping表上创建预插入触发器。 这需要检查该userid/ownerid组合的IS_MASTER = Y行的存在。
在另一个词,这将阻止相同的用户设置不同的所有者是它的主人? – 2012-07-18 13:55:09
是的,请参阅更新答案中的示例 – 2012-07-18 14:34:05