2012-05-21 3 views
-3

первая таблица 'A' состоит из refid (первичный ключ), имя, пол, возраст, статус, вторая таблица 'b' состоит из refid (первичный ключ) и statename, когда я пишу запрос в таблице A для ссылки B не работает, но он работал, когда я пытаюсь его из таблицы B 1) почему я не могу получить доступ из таблицы A?Я создал две таблицы, чтобы сначала создать внешний ключ для второго, это не сработает, но я могу получить, когда создаю его со второго, почему?

2) Я хочу знать, в чем разница между ссылаться на него из А и ссылаться на него из B?

  ALTER TABLE A 
     ADD FOREIGN KEY (refId) 
     REFERENCES B(refId) 

     // it doesn't work 

     ALTER TABLE B 
     ADD FOREIGN KEY (refId) 
     REFERENCES A(refId) 

     // it works 

К «не работает», я имею в виду, что я получаю сообщение об ошибке от внешнего ключа:

#1452 - Cannot add or update a child row: a foreign key constraint fails 
(testdrive.<result 2 when explaining filename '#sql-4b8_8d'>, CONSTRAINT 
#sql-4b8_8d_ibfk_1 FOREIGN KEY (refid) REFERENCES reserve (refid)) 
+3

«Не работает» не является объяснением – zerkms

+0

@zerkms Я имею в виду, что он не работает, когда я ссылаюсь на него от A, но он работает, когда я ссылаюсь на него из B, и я не знаю разницы между ссылкой таблицы B от A и A от B –

+0

все еще ничего не объясняет. Что означает «его не работает, когда ...»? – zerkms

ответ

1

Вы говорите, что вы получаете

Невозможно добавить или обновить дочерний ряд: ограничение внешнего ключа не выполнено

ошибка, если у вас есть FK от A.refid к B.refid:

ALTER TABLE A 
ADD FOREIGN KEY (refId) 
REFERENCES B(refId) 

Внешние ключи используются для поддержания ссылочной целостности, так что если у вас есть FK от A.refid до B.refid, то вы не можете вставить refid=X в A если refid=X уже не является в B. Сообщение об ошибке говорит вам, что вы пытаетесь вставить (или обновление) значение refid в A, что не в B, например:

insert into A (refid) values (1); 
insert into B (refid) values (1); 

Если обратный FK указать от B.refid к A.refid затем вышеуказанная последовательность INSERT будет работать. Или вы можете отменить ВСТАВКИ:

insert into B (refid) values (1); 
insert into A (refid) values (1); 

так, чтобы внешний ключ не был нарушен.

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

  • Нет связанных вопросов^_^