2013-05-19 80 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約束它,或兩者兼而有之。