我有一个INSERT ... ON DUPLICATE KEY UPDATE
查询,我正在尝试添加WHERE子句:
INSERT INTO `product_description` (
`product_id`,`language_id`,`name`,
`description`,`meta_description`,
`meta_keyword`,`tag`
) VALUES (
$getProductId, $languageId, '$pName', '$pDescription', '', '', ''
)
ON DUPLICATE KEY UPDATE
`name` = '$pName',
`description` = '$pDescription'
我想将UPDATE
限制为这两个条件:
WHERE `model` = 'specific-model' AND `sku` NOT LIKE '%B15%'
如果我将这部分查询添加到原始查询的末尾,我会收到MySQL语法错误。什么是可行的解决方案?
更新:请注意,型号和sku位于另一个表格中,公共密钥为product_id
答案 0 :(得分:4)
我建议你使用某种预处理语句而不是连接字符串,所以你应该这样做:
INSERT INTO `product_description` (
`product_id`, `language_id`, `name`,
`description`, `meta_description`,
`meta_keyword`, `tag`
) VALUES (?, ?, ?, ?,'','','')
但这不是问题的一部分。
我正在考虑回答一个简单的CASE WHEN
,但问题的挑战在于限制条件不在product_description
表中,而是来自另一个表。所以我认为我们可以使用TRIGGER
:
CREATE TRIGGER product_description_upd
BEFORE UPDATE ON product_description
FOR EACH ROW
IF NOT EXISTS(SELECT * FROM models
WHERE product_id=new.product_id
AND model='Abc' AND `sku` NOT LIKE '%B15%') THEN
SET new.name=old.name;
SET new.description=old.description;
END IF;
//
然后您可以使用INSERT
查询,例如:
INSERT INTO `product_description` (col1, col2, ...)
VALUES (..., ..., ...)
ON DUPLICATE KEY
UPDATE name=VALUE(name),description=VALUE(description)
请查看小提琴here。
此处唯一需要注意的是,即使标准UPDATE
查询也会受到影响。
答案 1 :(得分:1)
CREATE TABLE product_description (
product_id INT PRIMARY KEY,
name VARCHAR(100),
description VARCHAR(100)
);
CREATE TABLE models (
product_id INT,
model VARCHAR(100),
sku VARCHAR(100)
);
INSERT INTO models VALUES
(1, "Abc", "ZZZ"),
(2, "Abc", "B15");
INSERT INTO product_description VALUES
(1, "Car", "Red"),
(2, "Truck", "Pink");
INSERT INTO `product_description` VALUES (1, "NewCar", "DeepRed")
ON DUPLICATE KEY UPDATE name=VALUES(name), description=VALUES(description);
假设product_id
必须在模型中。
INSERT INTO `product_description` (product_id, name, description)
SELECT models.product_id, "SuperCar" as name, "DarkRed" as description
FROM `models` WHERE model="Abc" AND `sku` NOT LIKE "%B15%"
ON DUPLICATE KEY UPDATE name="UpdatedCar", description="UpdatedRed";
参考http://sqlfiddle.com/#!9/69624e/1
希望这可以解决问题。您可以使用SELECT
查询不同的结果。