Mysql-从SELECT插入,条件是重复密钥更新

Mysql-从SELECT插入,条件是重复密钥更新,mysql,Mysql,我正在阅读关于基于IF语句的复制密钥的条件更新的文章,例如 我正在尝试执行类似的操作,但在从select插入的过程中: 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(

我正在阅读关于基于IF语句的复制密钥的条件更新的文章,例如

我正在尝试执行类似的操作,但在从select插入的过程中:

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'会引发不同的错误)


有人有这方面的经验吗

mySQL不知道您指的是哪个数量,因为它同时存在于
data1
其他表中


您必须这样使用它:
other\u table.quantity

您的查询将这样更改

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)

您应该在查询的重复键更新部分的
中限定对属于表
data1
数量
字段的引用:

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)
编写此
IF()
表达式的较短方法是使用函数或:


此外,不需要使用
忽略
忽略
转换为警告的错误不再发生,因为重复键更新上的
子句。

在data1和其他表上使用表别名来消除歧义,并用表别名限定各自的列。我认为您应该使用其他表。Quantity感谢关于
忽略
。这是有道理的,但我从未考虑过。我不知道你可以用这种方式消除列的歧义。谢谢你帮我省去了很多挫折,@axiac!
ON DUPLICATE KEY UPDATE 
quantity = IFNULL(data1.quantity, VALUES(quantity))
ON DUPLICATE KEY UPDATE 
quantity = COALESCE(data1.quantity, VALUES(quantity))