2012-07-18 125 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行的存在。