MySQL обновление с ON DUPLICATE KEY UPDATE - PullRequest
2 голосов
/ 03 марта 2012

У меня есть таблица внешнего ключа, и я пытаюсь объединить повторяющиеся записи.

Моя таблица выглядит следующим образом:

user_id | object_id

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

Мой запрос выглядит так:

UPDATE user_object SET object_id = merge_obj_id WHERE object_id = old_object_id

Это работает нормально, пока пользователь не присоединится к старому объекту и объекту merged_object.Что вызывает дубликат.Я застрял, я могу придумать способы сделать это с несколькими запросами и манипулированием объектами, но я действительно хотел бы сделать это в SQL.

ОБНОВЛЕНИЕ: Это может работать?

INSERT INTO user_object (user_id,merge_object_id) SELECT user_id FROM user JOIN
user_object ON user.user_id = user_object.user_id WHERE object_id = old_object_id ON
DUPLICATE KEY (DELETE user_object WHERE user_object.user_id = user_id AND
user_object.user_id = old_object_id);`

ОБНОВЛЕНИЕ: Попробовал это:

ВСТАВИТЬ user_object (user_id, object_id) ВЫБРАТЬ 12345 как object_id, user.user_id как user_id FROMuser JOIN user_object ON user.user_id = user_object.user_id
WHERE user_object.object_id = 23456

Но выдает эту ошибку:

Невозможно добавить или обновить дочернюю строку: внешний ключограничение не выполняется (yourtable. user_object, CONSTRAINT FK_user_object_user_idx ИНОСТРАННЫЙ КЛЮЧ (user_id) ССЫЛКИ user (user_id))

Ответы [ 2 ]

2 голосов
/ 03 марта 2012

Вы можете использовать

REPLACE INTO user_object (user_id, object_id) SELECT 12345 в качестве object_id, user.user_id в качестве user_id FROM user JOIN user_object ON user.user_id = user_object.user_id WHERE user_object.object_id = 23456

Это удалит все старые строки, которые соответствуют перед вставкой новой строки.

Когда вы объединяете два объекта, вы сохраняете и старый объект, и объединенный объект, или вы удаляете один из них?Если вы удаляете новый объект, который был объединен со старым, то нет необходимости обновлять первичные ключи, так как ссылка на старый объект все еще действительна

0 голосов
/ 03 марта 2012

Я думаю, что вы хотите

INSERT .... ON DUPLICATE KEY UPDATE"

http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...