2012-07-18 114 views
3

假设我有一个一个Oracle检查约束

table User(userid, usernama)table Owner(ownerid, ownername)和创建多到许多用户和所有者之间

的is_master默认为“N”的接 table UserOwnerMapping(userid, ownerid, IS_MASTER) 。用户只能有一个主人。

我如何使用约束强制给用户不超过一个主人 ?

我正在使用Oracle。

回答

4

可以使用一个独特的基于函数的索引实现的约束:

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 
+0

在另一个词,这将阻止相同的用户设置不同的所有者是它的主人? – 2012-07-18 13:55:09

+0

是的,请参阅更新答案中的示例 – 2012-07-18 14:34:05

0

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

您的意思是ownerid可以是nullUserOwnerMapping

+0

用户有很多车主,只有一个是它的主用户ID OWNERID已经被设置为PK – 2012-07-18 10:14:12

0

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