2016-10-10 3 views
0

У меня есть таблица вроде этого:MySQL: как обновить внешний ключ из той же таблицы?

CREATE TABLE persons (
    personID int, 
    name varchar(255), 
    mother int, 
    father int, 
PRIMARY KEY (personID), 
FOREIGN KEY (mother) REFERENCES persons(personID), 
FOREIGN KEY (father) REFERENCES persons(personID)); 

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

Моя первая догадка была, конечно, это:

UPDATE persons 
SET mother = (select personID from persons where name = 'mothersname'), 
    father = (select personID from persons where name = 'fathersname') 
WHERE name = 'personsname'; 

Это, однако, приводит к You can't specify target table 'persons' for update in FROM clause. Поэтому я пробовал это:

SET @mother = (select personID from persons where name = 'mothersname'); 
SET @father = (select personID from persons where name = 'fathersname'); 
UPDATE persons 
SET mother = @mother, 
    father = @father 
WHERE name = 'personsname'; 

Это результат You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'set @father := (select personID from persons where name = 'fathersname');update pe' at line 1.

Как обычно в MySQL, это сообщение об ошибке не очень полезно. Может ли кто-нибудь дать мне подсказку о том, что будет правильным синтаксисом?

(Обратите внимание, что я бег обновления как JDBC PreparedStatement, все три названия получить набор через SetString(), а затем обрабатывается в пакетном режиме. Исключение, кажется, происходит в первом заявлении.)

+0

вам нужны псевдонимы для подзапросов. Также идея очень плохая, используя имя. Что, может быть только один человек по имени Мэри Смит? – Drew

+0

@Drew Вам не нужны псевдонимы, когда подзапросы используются в качестве выражений. – Barmar

+0

Но вам нужно обновление с шаблоном объединения else: http://i.imgur.com/sJDKtbZ.jpg – Drew

ответ

1

Использования a ПРИСОЕДИНЕНИЕ:

UPDATE persons AS pchild 
LEFT JOIN persons as pmom ON pmom.name = 'mothersname' 
LEFT JOIN persons AS pdad ON pdad.name = 'fathersname' 
SET pchild.mother = pmom.personID, 
    pchild.father = pdad.personID 

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

Ваша вторая попытка, использующая переменную, должна работать. Но вы должны выполнять каждый запрос в отдельном вызове. Большинство API-интерфейсов MySQL не позволяют размещать несколько запросов в одном вызове.

+0

Это выглядит многообещающим, но теперь я получаю 'Unknown column 'pchild.mother' в 'списке полей''. – mgtheater

+0

ОК, теперь он работает, видимо, мне не хватает места или чего-то еще. Спасибо за вашу помощь! – mgtheater

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