Oracle检查约束

时间:2012-07-18 10:01:35

标签: sql oracle jpa

假设我有一个

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

is_master默认为'N'。用户只能拥有一个主人。

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

我正在使用Oracle。

3 个答案:

答案 0 :(得分:4)

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

create unique index idx on userownermapping 
    (case when is_master='Y' then userid end);

这只会在is_master ='Y'时索引用户ID,因此当is_master ='Y'时强制userid是唯一的,否则不是:

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

答案 1 :(得分:0)

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

您的意思是ownerid nullUserOwnerMapping可以是{{1}}吗?

答案 2 :(得分:0)

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