gpt4 book ai didi

mysql - 在MySQL中使用IF语句在没有存储过程的情况下更新或插入?

转载 作者:太空宇宙 更新时间:2023-11-03 12:28:20 25 4
gpt4 key购买 nike

是否可以在 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

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

已解决:

正如 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 约束,或两者都有。

最佳答案

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

关于mysql - 在MySQL中使用IF语句在没有存储过程的情况下更新或插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16636203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com