假設我有一個一個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