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

请注意,我需要在 ONE 语句中执行上述操作。我不能跨越多个语句来实现上述功能..也没有存储过程:)

解决了:

正如 Gordon 所指出的,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约束,或两者兼而有之。

4

2 回答 2

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
于 2013-05-19T15:27:13.523 回答
0

正如 Gordon 所指出的,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约束,或两者兼而有之。

于 2013-05-19T15:33:38.160 回答