Комбинированный первичный ключ Oracle/внешний ключ

У меня есть составной первичный ключ в 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) 
); 

Ответ 1

Ошибка связана с тем, что FOREIGN KEY - это один столбец, но вы пытаетесь предоставить два столбца в качестве родителя. Нет необходимости привязывать к составному ключу, потому что 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.

Ответ 2

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));

* количество столбцов ссылок равно столбцам внешнего ключа

Ответ 3

Всякий раз, когда вы хотите создать составной первичный ключ или уникальное ограничение для столбца, вы не можете дать ссылку в другой таблице.

для ex.

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 - дочерняя таблица. Детская таблица может содержать повторяющиеся значения в одном столбце. Поэтому оракул не позволит эту таблицу столбца.

См. также

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

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

Итак, здесь также единственное ограничение для всех трех столбцов i.e a, b, c в таблице t1.

Вот почему вы не можете создать чужой по составному первичному ключу или сложному уникальному ограничению

Ответ 4

Вы не можете использовать:

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

Измените это:

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

Это должно работать.