2013-05-19 74 views
0

是它在某种程度上可以在MySQL中使用的IF语句来更新或插入一条记录到表中,而不必在存储过程中做呢?在MySQL中使用IF语句来更新或插入没有存储过程?

鉴于我设置的性质,我不能在这个时候,这就是为什么我要求使用存储过程..

基本上这就是我想要做的事:

​​

这里是我的代码:

IF NOT EXISTS 
(
    SELECT * FROM `oc_product_attribute` 
    WHERE PRODUCT_ID = (SELECT PRODUCT_ID FROM `oc_product_description` WHERE NAME = 'PRODUCT_NAME_HERE') 
    AND ATTRIBUTE_ID = (SELECT ATTRIBUTE_ID FROM `oc_attribute_description` WHERE NAME='ATTRIBUTE_NAME_HERE') 
) 
THEN 
    INSERT INTO `oc_product_attribute` 
    VALUES 
    (
    SELECT PRODUCT_ID FROM `oc_product_description` WHERE NAME = 'PRODUCT_NAME_HERE', 
    SELECT ATTRIBUTE_ID FROM `oc_attribute_description` WHERE NAME='ATTRIBUTE_NAME_HERE', 
    1, 
    'XYZ' 
    ) 
ELSE 
    UPDATE `oc_product_attribute` 
    SET TEXT = 'ABC' 
    WHERE PRODUCT_ID = (SELECT PRODUCT_ID FROM `oc_product_description` WHERE NAME = 'PRODUCT_NAME_HERE') 
    AND ATTRIBUTE_ID = (SELECT ATTRIBUTE_ID FROM `oc_attribute_description` WHERE NAME='ATTRIBUTE_NAME_HERE') 
END IF 

我得到这个错误与上面:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF NOT EXISTS (SELECT * FROM `oc_product_attribute` WHERE PRODUCT_ID = (SELE' at line 1 

请注意,我需要做上面只有一个声明。我无法跨越到多个语句来实现上述功能。也没有存储的过程:)

解决:

正如戈登指出,ON DUPLICATE KEY正是我需要的。这里是一个工作的最后声明:

INSERT INTO `oc_product_attribute` 
VALUES 
(
(SELECT PRODUCT_ID FROM `oc_product_description` WHERE NAME = 'PRODUCT_NAME_HERE'), 
(SELECT ATTRIBUTE_ID FROM `oc_attribute_description` WHERE NAME='ATTRIBUTE_NAME_HERE'), 
1, 
'XYZ' 
) 
ON DUPLICATE KEY UPDATE TEXT='ABC'; 

但这是假设表有两种PRIMARY KEYUNIQUE约束它,或两者兼而有之。

+0

。 。您可能需要'在重复键更新“语法中插入...。看看https://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html。 –

回答

3

MySQL有这方面的情况特殊功能。它叫做INSERT...ON DUPLICATE KEY UPDATE。它所做的是它试图INSERT一个纪录,但如果它已经存在,它只是UPDATE它。 '

为了使此功能正常工作,您需要在表上有一个UNIQUE约束。根据你的例子,我可以看到你正在检查两列的存在。如果您已有PRIMARY KEY,则只需在两列上添加UNIQUE约束即可。

ALTER TABLE oc_product_attribute 
     ADD CONSTRAINT tb_uq UNIQUE(PRODUCT_ID, ATTRIBUTE_ID) 

一旦它已经被执行,你现在可以使用INSERT..ON DUPLICATE KEY UPDATE

INSERT INTO oc_product_attribute (PRODUCT_ID, ATTRIBUTE_ID, OtherCol, TEXT) 
SELECT MAX(PRODUCT_ID), MAX(ATTRIBUTE_ID), 1, 'XYZ' 
FROM 
     (
      SELECT PRODUCT_ID, NULL ATTRIBUTE_ID 
      FROM oc_product_description 
      WHERE NAME = 'PRODUCT_NAME_HERE' 
      UNION ALL 
      SELECT NULL PRODUCT_ID, ATTRIBUTE_ID 
      FROM oc_attribute_description 
      WHERE NAME='ATTRIBUTE_NAME_HERE' 
     ) x 
ON DUPLICATE KEY UPDATE TEXT = 'ABC' 

-- change OtherCol to the name of your column which you want to insert 1 
+0

标记为你的答案,但戈登实际上首先告诉我:) – Ahmad

0

正如指出的戈登,ON DUPLICATE KEY正是我需要的。这里是一个工作的最后声明:

INSERT INTO `oc_product_attribute` 
VALUES 
(
(SELECT PRODUCT_ID FROM `oc_product_description` WHERE NAME = 'PRODUCT_NAME_HERE'), 
(SELECT ATTRIBUTE_ID FROM `oc_attribute_description` WHERE NAME='ATTRIBUTE_NAME_HERE'), 
1, 
'XYZ' 
) 
ON DUPLICATE KEY UPDATE TEXT='ABC'; 

但这是假设表有两种PRIMARY KEYUNIQUE约束它,或两者兼而有之。