2015-05-14 3 views
1

Я отправлю только основную часть. У меня есть две таблицы, каждая из которых должна иметь ПК другого как FK. Почему я не могу добавить этот внешний ключ?

CREATE TABLE apartment 
(
    cod_apartment INT NOT NULL PRIMARY KEY, 
    cod_offer INT NOT NULL 
); 

CREATE TABLE offer 
(
    cod_offer INT NOT NULL PRIMARY KEY, 
    cod_apartment INT NOT NULL 
); 

Сначала я вставил значения обеих таблиц и работал, я мог бы даже искать с помощью «выберите * из ...». Но затем я попытался добавить внешний ключ:

Это сработало.

ALTER TABLE offer 
ADD FOREIGN KEY (cod_apartment) REFERENCES apartment; 

И это не так.

ALTER TABLE apartment 
ADD FOREIGN KEY (cod_offer) REFERENCES offer; 

Это сообщение об ошибке:

Оператор TABLE ALTER противоречили с ограничением FOREIGN KEY "FK__apartment__cod_offer__6383C8BA". Конфликт произошел в базе данных «kleber_apartment», таблице «dbo.offer», в столбце «cod_offer».

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

Что может быть?

+0

Являются ли данные в полях cod_offer этих двух таблиц совместимыми с ограничениями внешнего ключа? –

+0

Зачем вам нужны внешние ключи, которые идут в обе стороны? Похоже, что это сделает добавление данных очень громоздким. –

ответ

6

Это означает, что вы пытаетесь добавить внешний ключ, если существующие данные не подчиняются этому ограничению. Таким образом, у вас есть запись в вашей таблице apartment, где столбец cod_offer не соответствует никакому значению в таблице cod_apartment.

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

И в отношении 6383C8BA, когда вы добавляете ограничение без указания имени, SQL Server выбирает один для вас. Лично я рекомендовал бы что-то вроде:

alter table dbo.apartment 
add constraint FK_apartment__cod_offer 
foreign key (cod_offer) references dbo.offer (cod_offer); 

Это позволяет определить имена, как вы хотите, и это немного более ясно, о том, что вы на самом деле здание.

+0

Я чувствую себя глупым, потому что раньше этого не заметил. Ограничения были правильными, но я допустил ошибку, вставляя значения в столбцы обеих таблиц. Спасибо! – Kleber

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