MySQL で IF ステートメントを使用して、ストアド プロシージャ内で行うことなく、テーブルにレコードを更新または挿入することは何とか可能ですか?
私のセットアップの性質上、現時点ではストアド プロシージャを使用できません。
基本的に、これは私がやろうとしていることです:
IF NOT EXISTS (SELECT ........)
THEN
INSERT ......
ELSE
UPDATE ......
END 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
上記を正確に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 KEY
ただし、これは、テーブルにまたはUNIQUE
制約、またはその両方があることを前提としています。