与WHERE重复更新密钥更新

时间:2015-09-14 21:56:03

标签: mysql sql database

我有一个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

2 个答案:

答案 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查询不同的结果。