У меня есть таблица вроде этого: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(), а затем обрабатывается в пакетном режиме. Исключение, кажется, происходит в первом заявлении.)
вам нужны псевдонимы для подзапросов. Также идея очень плохая, используя имя. Что, может быть только один человек по имени Мэри Смит? – Drew
@Drew Вам не нужны псевдонимы, когда подзапросы используются в качестве выражений. – Barmar
Но вам нужно обновление с шаблоном объединения else: http://i.imgur.com/sJDKtbZ.jpg – Drew