3

私が持っているとしましょう

table User(userid, usernama)そして、 ユーザーと所有者の間に多対多を作成するtable Owner(ownerid, ownername)結合 されたtable UserOwnerMapping(userid, ownerid, IS_MASTER)

is_masterのデフォルトは「N」です。ユーザーはマスターを1つだけ持つことができます。

制約を使用して、ユーザーに1つだけのマスターを強制するにはどうすればよいですか?

Oracleを使用しています。

4

3 に答える 3

4

一意の関数ベースのインデックスを使用して制約を実現できます。

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

これは、is_master ='Y'の場合にのみuseridにインデックスを付けるため、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
于 2012-07-18T11:09:42.143 に答える
0

useridを一意にすることで問題を解決できます。なぜあなたは必要is_masterですか?

中にownerid入ることができるという意味ですか?nullUserOwnerMapping

于 2012-07-18T10:08:41.807 に答える
0

UserOwnerMappingテーブルに事前挿入トリガーを作成する必要があります。これは、そのuserid/owneridの組み合わせのIS_MASTER=Y行の存在を確認する必要があります。

于 2012-07-18T10:45:32.043 に答える