我正在阅读基于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'会抛出不同的错误。)
任何人都有这方面的经验吗?
答案 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不知道您引用的是哪个数量列,因为它存在于data1
和other_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)