web-dev-qa-db-ja.com

Oracle複合主キー/外部キーの質問

Oracleの1つのテーブルに複合主キーがあります。最初のテーブルの複合主キーを参照する2番目のテーブルの1つのテーブルエントリの外部キーを作成します。エラーORA-02256が発生します。これをどのように入力できるかについての考えはありますか?

CREATE TABLE groupspersonx ( 
  personid number, 
  groupid number, 
  CONSTRAINT pk_persongroupid PRIMARY KEY(personid, groupid) 
); 

CREATE TABLE restrictedgroups ( 
  groupid number, 
  name varchar2(50), 
  dateadded date, 
  since date, 
  notes varchar2(1024), 
  CONSTRAINT pk_groupid PRIMARY KEY(groupid), 
  CONSTRAINT fk_persongroup FOREIGN KEY(groupid) REFERENCES groupspersonx(personid, groupid) 
); 
12
Christopher

エラーは、FOREIGN KEYが1つの列であるためですが、親として2つの列を指定しようとしています。 restrictedgroupsにはpersonid列がないため、複合キーに関連付ける必要はありません...

また、後方にも関係があります。以下を使用してください。

CREATE TABLE restrictedgroups ( 
  groupid number, 
  name varchar2(50), 
  dateadded date, 
  since date, 
  notes varchar2(1024), 
  CONSTRAINT pk_groupid PRIMARY KEY(groupid)
);

CREATE TABLE groupspersonx ( 
  personid number, 
  groupid number, 
  CONSTRAINT pk_persongroupid PRIMARY KEY(personid, groupid),
  CONSTRAINT fk_persongroup FOREIGN KEY(groupid) REFERENCES restrictedgroups(groupid) 
); 

personidがどのテーブルからのものになるかについて、外部キー制約を追加します。

19
OMG Ponies
CREATE TABLE groupspersonx( 
  personid number, groupid number, 
CONSTRAINT pk_persongroupid PRIMARY KEY(personid, groupid));

CREATE TABLE restrictedgroups ( 
  pid number, 
  groupid number,
  name varchar2(50), 
  dateadded date, 
  since date, 
  notes varchar2(1024), 
  CONSTRAINT pk_groupid PRIMARY KEY(groupid), 
  CONSTRAINT fk_persongroup FOREIGN KEY(pid,groupid) REFERENCES groupspersonx(personid, groupid));

*参照列の数が外部キー列と等しい

4
user2178442

列に複合主キーまたは一意の制約を作成する場合は常に、別のテーブルで参照を与えることはできません。

例として。

sql>create table t1( a number,b number,c number ,primary key(a,b,c));

table created.

sql>create table g1(a number constraint con_fg references t1(a));

ERROR at line 1:
ORA-02270: no matching unique or primary key for this column-list

ここで、t1は親テーブルで、g1は子テーブルです。子テーブルには、1つの列に重複する値を含めることができます。したがって、Oracleはその列のテーブルを許可しません。

こちらもご覧ください

SQL>select constraint_name,constraint_type from user_constraints where table_name='T1';

CONSTRAINT_NAME                C
------------------------------ -
SYS_C005822                    P

したがって、ここでも3つの列すべての唯一の制約、つまりt1テーブルのa、b、cです。

そのため、複合主キーまたは複合一意制約に外部を作成できません

1
harikrish

次のものは使用できません。

CONSTRAINT fk_persongroup FOREIGN KEY(groupid) REFERENCES groupspersonx(personid, groupid)

それも変更してください:

CONSTRAINT fk_persongroup FOREIGN KEY(groupid) REFERENCES groupspersonx(groupid) 

うまくいくはずです。

0
Jay