Mysql 如何使用重复的键更新语法有条件地更新包含分隔值的列

Mysql 如何使用重复的键更新语法有条件地更新包含分隔值的列,mysql,sql,key,duplicates,Mysql,Sql,Key,Duplicates,我试图用这个语句更新多条记录(大约一千条记录)(这是一个每晚都会运行的过程)。为了简单起见,以下声明仅包括3种产品: INSERT INTO productinventory (ProductID, VendorID, CustomerPrice, ProductOverrides) VALUES (123, 3, 100.00, 'CustomerPrice'), (124, 3, 100.00, 'CustomerPrice'), (125, 3, 100.00, 'Cust

我试图用这个语句更新多条记录(大约一千条记录)(这是一个每晚都会运行的过程)。为了简单起见,以下声明仅包括3种产品:

INSERT INTO productinventory
  (ProductID, VendorID, CustomerPrice, ProductOverrides)
VALUES
  (123, 3, 100.00, 'CustomerPrice'),
  (124, 3, 100.00, 'CustomerPrice'),
  (125, 3, 100.00, 'CustomerPrice')
ON DUPLICATE KEY UPDATE
  CustomerPrice = VALUES(CustomerPrice),
  ProductOverrides = CONCAT_WS(',', ProductOverrides, 'CustomerPrice')
;
除了每次运行此语句时,
ProductOverrides
列都会添加文本
'CustomerPrice'
,因此在运行两次后,结果如下所示:

CustomerPrice,CustomerPrice 顾客价格,顾客价格
我想让语句做的是将
'CustomerPrice'
添加到
ProductOverrides
列中,但前提是该列中不存在该字符串。所以不管我运行这个语句多少次,它只包含那个字符串一次。如何修改此语句以实现此目的

你可以这样做

INSERT INTO productinventory (ProductID, VendorID, CustomerPrice, ProductOverrides) 
VALUES 
(123, 3, 100.00, 'CustomerPrice'), 
(124, 3, 100.00, 'CustomerPrice'), 
(125, 3, 100.00, 'CustomerPrice') 
ON DUPLICATE KEY UPDATE 
  CustomerPrice = VALUES(CustomerPrice), 
  ProductOverrides = IF(FIND_IN_SET(VALUES(ProductOverrides), ProductOverrides) > 0, 
                        ProductOverrides, 
                        CONCAT_WS(',', ProductOverrides, VALUES(ProductOverrides)));

这里是演示

看,我认为这不会解决我的问题,而不会产生更多的问题。ProductOverrides列告诉系统在主数据馈送运行时不更新列。它在该字段中查找列名,如果它存在,则忽略它。必须有一种方法来检查列中是否存在字符串,然后在MYSQL中忽略它。ProductOverrides列将包含系统在其他更新过程中要忽略的其他列名的列表。因此,在上面的SQL语句运行之前,ProductOverrides列中的典型值可能如下所示:“Title,Description”。然后在它运行之后,我希望它看起来像:“Title,Description,CustomerPrice”。使用上面的IF()可以吗?我理解这一点,我的示例就是这样做的。我已经更新了SQLFiddle示例。仔细看看。如果列表中已经有一个
ProductOverrides
值,并且您在insert中传递了该值,则不会再添加该值。是的,您是对的。我运行了它,它运行得非常好。谢谢大家!@凯勒索普,不客气。我很高兴能帮上忙:)祝你好运。