0

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制約、またはその両方があることを前提としています。

4

2 に答える 2

3

MySQL には、この状況に対する特別な機能があります。と呼ばれていINSERT...ON DUPLICATE KEY UPDATEます。それが何をするかというと、レコードを試みINSERTますが、それがすでに存在する場合は、それだけUPDATEです。'

この機能を機能させるにはUNIQUE、テーブルに制約を設定する必要があります。あなたの例に基づいて、2 つの列の存在を確認していることがわかります。がすでにある場合は、両方の列に制約を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
于 2013-05-19T15:27:13.523 に答える
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 KEYただし、これは、テーブルにまたはUNIQUE制約、またはその両方があることを前提としています。

于 2013-05-19T15:33:38.160 に答える