如果两个非关键
字段匹配,我有一个语法问题,尝试UPDATE
。 -- INSERT
如果不匹配。
首先我要说的是,我有一个有效查询,其中涉及 SELECT
和 ON DUPLICATE KEY UPDATE
。现在我只是好奇,可以用不同的方式来做吗?
出于纯粹的好奇,我正在以不需要主键
的方式尝试此操作。这实际上只是一个实验,看看是否可以完成。
我想要的是像 ON DUPLICATE KEY UPDATE
- 但是:
- 假设我不知道
key
,并且 - 假设我无法通过
SELECT
获取 key
这是我的数据结构:
+--------------------------------------------------------------------------+
| id | contractor_id | email_type_id | email_address |
+--------------------------------------------------------------------------+
表创建:
CREATE TABLE `email_list` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`contractor_id` int(11) NOT NULL,
`email_type_id` int(11) NOT NULL,
`email_address` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
现在我想要做的没有选择和没有重复 key 更新是 - 如果contractor_id
和 email_type_id
匹配 -- UPDATE
email_address
-- else INSERT
。
如果尝试过这个——(我知道我违反了我自己的不选择规则):
IF EXISTS (SELECT * FROM email_list WHERE contractor_id = 1166)
UPDATE email_list SET (email_address='herky_jerky@snailmail.com')
WHERE contractor_id = 1166 AND email_type_id = 4
ELSE
INSERT INTO email_list VALUES (
contractor_id = 1166,
email_type_id = 4,
email_address = 'herky_jerky@snailmail.com');
我明白为什么这不起作用..我只是不知道它的解决方法是什么 - 使用 IF - ELSE 也感觉有点笨拙
声明。另外,我不想使用 SELECT
——所以我考虑只使用 IF
,例如:
UPDATE email_list SET email_address = 'herky@jerky.com'
WHERE contractor_id = 1166 AND email_type_id = 4
IF @@ROWCOUNT=0
INSERT INTO email_list VALUES (
contractor_id = 1166,
email_type_id = 4,
email_address = 'herky@jerky.com');
但我不明白为什么那个不起作用。这只是一个练习,旨在了解人们如何利用此类查询发挥创意。我认为我的两个想法都是可行的——任何人都可以找到任一查询的修复程序以使其工作吗?
我也很想看到其他更有创意的方法来尝试我所要求的任务!
最佳答案
我将使用 UPDATE
来实现此操作,然后测试 ROW_COUNT()
,如果没有更新任何行,则 INSERT
。
drop table if exists t;
create table t (id int, x int, y int, str varchar(255));
insert into t (id, x, y, str) values (1, 2, 3, 'foo');
select * from t;
update t set str = 'bar'
where x = 2 and y = 3;
insert into t (id, x, y, str)
select 1, 2, 3, 'inserted'
from dual
where row_count() = 0;
select * from t;
update t set str = 'baz'
where x = 20 and y = 30;
insert into t (id, x, y, str)
select 10, 20, 30, 'baz'
from dual
where row_count() = 0;
select * from t;
drop table t;
您可以在此处查看它的实际效果:https://rextester.com/FRFTE79537
这里的想法是,您首先执行UPDATE
,然后执行INSERT ... SELECT
,其中SELECT
仅返回一行< em>if ROW_COUNT() = 0
为 true,并且仅当 UPDATE
不匹配任何行时才为 true。
关于mysql - 用于在更新之前检查重复项的 SQL 语法(不是 DUPLICATE KEY UPDATE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52978804/