2015-04-01 58 views
1

我正在阅读有关基于IF语句的重复键上的条件更新 - 例如MySQL Conditional Insert on DuplicateMysql - 从条件选择INSERT重复更新

我试图做同样的事情,但是从选择的插件内:

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

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

+1

在data1和other_table上使用表别名来消除歧义并使用表别名限定其各自的列。 – 2015-04-01 09:08:59

+1

我想你应该使用other_table.quantity – Abhi 2015-04-01 09:09:12

回答

1

你应该有资格在的的ON DUPLICATE KEY UPDATE部分属于该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()表达式的更简短方法是使用功能IFNULL()COALESCE()

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

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

此外,也没有必要使用IGNORE。由于ON DUPLICATE KEY UPDATE子句,IGNORE转换为警告的错误不再发生。

+1

感谢您关于'IGNORE'的注释。这是有道理的,但我从来没有考虑过它。 – 2015-04-02 18:58:41

+0

不知道你可以用这种方式消歧列。谢谢你为我节省了很多挫折,@axiac! – 2017-05-09 19:23:28

0

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

你必须使用这样的:other_table.quantity

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)