ВСТАВИТЬ В ... ВЫБРАТЬ ИЗ ... ПРИ ОБНОВЛЕНИИ ДУБЛИКАТА КЛЮЧА
Я делаю запрос вставки, где большинство из многих столбцов должны быть обновлены до новых значений, если уникальный ключ уже существовал. Это звучит примерно так:
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 ClauseINSERT 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, ...