Mysql - 来自SELECT的INSERT,带有条件ON DUPLICATE KEY UPDATE

时间:2015-04-01 09:06:13

标签: mysql

我正在阅读基于IF语句的重复键的条件更新 - 例如MySQL Conditional Insert on Duplicate

我正在尝试做类似的事情,但是在选择的插入内:

INSERT IGNORE INTO data1 (id, date, quantity)
SELECT id, date, quantity
FROM other_table
WHERE date = '2015-03-01'
AND id=123
ON DUPLICATE KEY UPDATE 
quantity = IF(quantity IS NULL, VALUES(quantity), quantity)

但是,这会产生错误:

#1052 - Column 'quantity' in field list is ambiguous 

我无法弄清楚如何告诉MySQL哪个'数量'字段是为了解决模糊问题。为每个表添加别名似乎没有帮助(调用data1'd'会抛出不同的错误。)

任何人都有这方面的经验吗?

3 个答案:

答案 0 :(得分:2)

您应该对查询的quantity部分中属于表data1的{​​{1}}字段的引用进行限定:

ON DUPLICATE KEY UPDATE

编写此INSERT INTO data1 (id, date, quantity) SELECT id, date, quantity FROM other_table WHERE date = '2015-03-01' AND id=123 ON DUPLICATE KEY UPDATE quantity = IF(data1.quantity IS NULL, VALUES(quantity), data1.quantity) 表达式的更简单方法是使用函数IFNULL()COALESCE()

IF()

ON DUPLICATE KEY UPDATE 
quantity = IFNULL(data1.quantity, VALUES(quantity))

此外,无需使用ON DUPLICATE KEY UPDATE quantity = COALESCE(data1.quantity, VALUES(quantity)) 。由于IGNORE子句,IGNORE转换为警告的错误不再发生。

答案 1 :(得分:0)

mySQL不知道您引用的是哪个数量列,因为它存在于data1other_table表中。

你必须像这样使用它:other_table.quantity

答案 2 :(得分:0)

您的查询会像这样更改

INSERT IGNORE INTO data1 (id, date, quantity)
SELECT id, date, quantity
FROM other_table
WHERE date = '2015-03-01'
AND id=123
ON DUPLICATE KEY UPDATE 
data1.quantity = IF(other_table.quantity IS NULL,
VALUES(other_table.quantity), other_table.quantity)