Mysql 如何使用重复的键更新语法有条件地更新包含分隔值的列
我试图用这个语句更新多条记录(大约一千条记录)(这是一个每晚都会运行的过程)。为了简单起见,以下声明仅包括3种产品: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
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中传递了该值,则不会再添加该值。是的,您是对的。我运行了它,它运行得非常好。谢谢大家!@凯勒索普,不客气。我很高兴能帮上忙:)祝你好运。