[英]Using IF statement in MySQL to update or insert without Stored Procedure?
是否可以在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
请注意,我需要在完全一个语句中执行上述操作。 我无法跨越多个语句来实现上述功能..也没有存储过程:)
解决了:
正如戈登指出的那样,我需要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
约束,或两者都有。
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
正如戈登指出的那样,我需要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
约束,或两者都有。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.