2017-01-30 2 views
0

Я работаю с тремя таблицами.Почему я получаю эту ошибку: Ошибка 1215 Не удается добавить ограничение внешнего ключа?

CREATE TABLE Unit(
AptNumber integer(4), 
PopertyId integer(4), 
RentalPrice integer(8), 
Size varchar (20), 
PRIMARY KEY (PopertyId, AptNumber), 
FOREIGN KEY (PopertyId) REFERENCES Property (Id) 
); 


CREATE TABLE Customer(
Name varchar(15), 
RenterId integer(6), 
PRIMARY KEY(RenterId) 
); 

и

CREATE TABLE Rentals(
AptNumber integer(4), 
RenterId integer(6), 
StartDate varchar(8), 
EndDate varchar(8), 
PRIMARY KEY(AptNumber, RenterId), 
FOREIGN KEY (AptNumber) REFERENCES Unit(AptNumber), 
FOREIGN KEY (RenterId) REFERENCES Customer(RenterId) 
); 

Когда я пытаюсь создать третью таблицу, аренда, я получаю сообщение об ошибке. ОШИБКА 1215 (HY000): Невозможно добавить ограничение внешнего ключа.

Мои ключи соответствуют типу и размеру данных, поэтому я не уверен, в чем проблема.

Благодарим за помощь.

+0

Где ваш таблица собственности? –

ответ

1

Это проблема:

FOREIGN KEY (AptNumber) REFERENCES Unit(AptNumber), 

При ссылке на родительский столбец как единицы (AptNumber), что столбец должен быть первый столбец в качестве ключа в указанной таблице.

Но ваше есть второй столбец первичного ключа блока:

PRIMARY KEY (PopertyId, AptNumber), 

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

Технически InnoDB имеет нестандартную функцию, которая позволяет внешнему ключу ссылаться на поднабор столбцов первичного ключа родителя, но это означает, что ваша дочерняя строка может ссылаться на несколько строк в родительской таблице. Это вызывает массу странных случаев, например, если вы удалите строку в родительской таблице? Лучше избегать создания таких внешних ключей.

0

Его лучше:

1.Create Main table first with Primary Key. 
2.Create Foreign Key table without a constraints. 

и так далее ....

Alter стол tbl_foreign добавить контрсилами:

ALTER TABLE tbl_foreign 
ADD FOREIGN KEY (P_Id) 
REFERENCES Persons(P_Id) 

Смотрите это для Alter таблицы ограничивающего

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