ВСТАВИТЬ В ... ВЫБРАТЬ ИЗ ... ПРИ ОБНОВЛЕНИИ ДУБЛИКАТА КЛЮЧА
Я делаю запрос вставки, где большинство из многих столбцов должны быть обновлены до новых значений, если уникальный ключ уже существовал. Это звучит примерно так:
INSERT INTO lee(exp_id, created_by,
location, animal,
starttime, endtime, entct,
inact, inadur, inadist,
smlct, smldur, smldist,
larct, lardur, lardist,
emptyct, emptydur)
SELECT id, uid, t.location, t.animal, t.starttime, t.endtime, t.entct,
t.inact, t.inadur, t.inadist,
t.smlct, t.smldur, t.smldist,
t.larct, t.lardur, t.lardist,
t.emptyct, t.emptydur
FROM tmp t WHERE uid=x
ON DUPLICATE KEY UPDATE ...;
//update all fields to values from SELECT,
// except for exp_id, created_by, location, animal,
// starttime, endtime
Я не уверен, что синтаксис UPDATE
пункт должен быть. Как я могу ссылаться на текущую строку из SELECT
предложения?
2 ответа:
MySQL будет принимать часть перед равными ссылками на столбцы, названные в предложении INSERT INTO, а вторая часть ссылается на выбранные столбцы.
INSERT INTO lee(exp_id, created_by, location, animal, starttime, endtime, entct, inact, inadur, inadist, smlct, smldur, smldist, larct, lardur, lardist, emptyct, emptydur) SELECT id, uid, t.location, t.animal, t.starttime, t.endtime, t.entct, t.inact, t.inadur, t.inadist, t.smlct, t.smldur, t.smldist, t.larct, t.lardur, t.lardist, t.emptyct, t.emptydur FROM tmp t WHERE uid=x ON DUPLICATE KEY UPDATE entct=t.entct, inact=t.inact, ...
хотя я очень поздно к этому, но после просмотра некоторых законных вопросов для тех, кто хотел использовать
INSERT-SELECT
запросGROUP BY
пункт, я придумал работу вокруг этого.С далее ответ Маркус Адамс и бухгалтерского учета
GROUP BY
в нем, это, как я решить проблему с помощьюSubqueries in the FROM Clause
INSERT INTO lee(exp_id, created_by, location, animal, starttime, endtime, entct, inact, inadur, inadist, smlct, smldur, smldist, larct, lardur, lardist, emptyct, emptydur) SELECT sb.id, uid, sb.location, sb.animal, sb.starttime, sb.endtime, sb.entct, sb.inact, sb.inadur, sb.inadist, sb.smlct, sb.smldur, sb.smldist, sb.larct, sb.lardur, sb.lardist, sb.emptyct, sb.emptydur FROM (SELECT id, uid, location, animal, starttime, endtime, entct, inact, inadur, inadist, smlct, smldur, smldist, larct, lardur, lardist, emptyct, emptydur FROM tmp WHERE uid=x GROUP BY location) as sb ON DUPLICATE KEY UPDATE entct=sb.entct, inact=sb.inact, ...