Комбинированный первичный ключ 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)
Это должно работать.