首页 > 解决方案 > 如何在 IF 语句中使用 INSERT INTO SELECT ON DUPLICATE KEY UPDATE

问题描述

在这里,我试图在给定条件下对 MySQL 中的重复键更新记录进行操作。假设我有一个名为“Item”的表和另一个名为“Item_backup”的表,其中包含一组应插入原始“Item”表的备份记录。这两个表的结构在这两个表中是相同的。

当插入数据记录时,如果有任何重复的键,那么我需要检查 insert_date 列,并且只有当“Item”表中的 insert_date 列小于“Item_backup”表中的 insert_date 列时,才应更新记录。

我使用的查询是,

INSERT INTO ITEM (item_number, price, quantity, insert_date)
SELECT ib.item_number, ib.price, ib.quantity, ib.insert_date 
FROM ITEM_backup ib
ON DUPLICATE KEY UPDATE
item_number = IF(@is_a_new_record := insert_date < ib.insert_date, ib.item_number, item_number),
price = IF(@is_a_new_record, ib.price, price),
quantity = IF(@is_a_new_record, ib.quantity, quantity),
insert_date = IF(@is_a_new_record, ib.insert_date, insert_date);

现在出现这样的错误, “SQL 错误:字段列表中的列 'insert_date' 不明确”

谁能指出这个查询有什么问题?

标签: mysqldatabasesql-inserton-duplicate-key

解决方案


最后,我找到了正确的答案。

INSERT INTO ITEM (item_number, price, quantity, insert_date)
SELECT ib.item_number, ib.price, ib.quantity, ib.insert_date 
FROM ITEM_backup ib
ON DUPLICATE KEY UPDATE
item_number = IF(@is_a_new_record := ITEM.insert_date < ib.insert_date, ib.item_number, ITEM.item_number),
price = IF(@is_a_new_record, ib.price, ITEM.price),
quantity = IF(@is_a_new_record, ib.quantity, ITEM.quantity),
insert_date = IF(@is_a_new_record, ib.insert_date, ITEM.insert_date);

推荐阅读