2014-09-10 2 views
0

Я использую DB2 для создания некоторых таблиц. У меня есть 2 таблицы, которые выглядят следующим образом:Ссылка на несколько первичных ключей в другой таблице

create table TEST_TABLE1 
/* */ 
(
PRIMARY_COLUMN1 int not null, 
PRIMARY_COLUMN2 varchar(50) not null, 
primary key (PRIMARY_COLUMN1,PRIMARY_COLUMN2) 
); 

create table TEST_TABLE2 
/* */ 
(
PRIMARY_COLUMN1 int references TEST_TABLE1(PRIMARY_COLUMN1) not null, 
PRIMARY_COLUMN2 varchar(50) references TEST_TABLE1(PRIMARY_COLUMN2) not null, 
primary key(PRIMARY_COLUMN1,PRIMARY_COLUMN2) 
); 

Когда я пытаюсь добавить таблицы, я получаю эту ошибку:

SQL0573N A column list specified in the references clause of constraint 
"PRIMARY_COLUMN1..." does not identify a unique constraint of the parent table 
or nickname "DB2INST1.TEST_TABLE1". SQLSTATE=42890 

Кто-нибудь знает, как я могу получить TEST_TABLE2 ссылаться TEST_TABLE1?

Я также пытался создать TEST_TABLE2, как это и получил ту же ошибку:

create table TEST_TABLE2 
/* */ 
(
PRIMARY_COLUMN1 int references TEST_TABLE1(PRIMARY_COLUMN1) not null, 

primary key(PRIMARY_COLUMN1) 
); 

Спасибо, Джастин

+0

То, что вы здесь ** один ** первичный ключ, который случается содержать несколько столбцов (. Ака «композит» или «соединение» PK) , Поскольку у вас есть только один ПК, вам нужен только один FK для его ссылки. Но вам нужно ссылаться на ** whole ** PK, а не только на одну из ее колонок. –

ответ

2

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

Логическое объяснение было бы .. Скажем, у вас есть имена

FIRST LAST 
----------- 
John Abraham 
John Jones 

При создании внешнего ключа refence только для обозначения первого столбца, может быть два значения в родителя. Что явно двусмысленно! Если вы создаете ссылку на включение обоих этих столбцов (что уникально), то двусмысленность больше не существует!

Сообщение об ошибке, которое вы получили, сообщает об этом же.

does not identify a unique constraint of the parent table 

Now..Analysing ур DDL,

create table TEST_TABLE1 
/* */ 
(
PRIMARY_COLUMN1 int not null, 
PRIMARY_COLUMN2 varchar(50) not null, 
primary key (PRIMARY_COLUMN1,PRIMARY_COLUMN2) <<----- Unique over 2 columns 
); 

Вы определяете PK в Table1, включая 2 колонки.

Где, как и во второй таблице, вы просто создаете внешний ключ, ссылаясь на один из этих столбцов! Итак, ошибка.

create table TEST_TABLE2 
/* */ 
(
PRIMARY_COLUMN1 int 
    references TEST_TABLE1(PRIMARY_COLUMN1) not null, <<--------FK refers only one of them? 

primary key(PRIMARY_COLUMN1) 
); 

И решение может быть:

create table TEST_TABLE2 
/* */ 
(
PRIMARY_COLUMN1 int not null, 
PRIMARY_COLUMN2 varchar(50) not null, 
primary key(PRIMARY_COLUMN1,PRIMARY_COLUMN2), 
CONSTRAINT my_foreign FOREIGN KEY (PRIMARY_COLUMN1,PRIMARY_COLUMN2) 
        REFERENCES TEST_TABLE1(PRIMARY_COLUMN1,PRIMARY_COLUMN2) 
    <<---- Refer both columns.. 
); 
+0

Я попробовал это в первую очередь и получил ту же ошибку. См. Правки в моем сообщении выше для примера. – Justin

+1

Добавлено несколько объяснений –

+0

Я вижу, почему мое решение не работает. Есть ли способ заставить его работать? Могу ли я как-то указать, что 2 столбца в таблице 2 уникальны в таблице 1? – Justin

Смежные вопросы