sql语法,用于在更新前检查重复项(不是重复密钥更新)

ymdaylpp  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(321)

我有一个语法问题,试图 UPDATE 如果2 non key 字段匹配。- INSERT 如果不匹配。
让我先说我有一个工作查询,涉及 SELECT 带着一个 ON DUPLICATE KEY UPDATE . 现在我只是好奇,能不能换个方式?
出于纯粹的好奇,我尝试这种方式,将不需要 primary key . 这真的只是一个实验,看看是否可以做到。
我想要的是 ON DUPLICATE KEY UPDATE --但是:
让我们假装我不知道 key ,和
让我们假装我拿不到钥匙 SELECT 以下是我的数据结构:

+--------------------------------------------------------------------------+ 
|   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;

现在我要做的是,如果没有select和on-duplicate键更新 contractor_idemail_type_id 匹配- UPDATE 这个 email_address --其他 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');

但我不明白为什么那个不行。这只是一个练习,看看这种类型的查询有多有创意。我认为我的两个想法都是可行的——有人能为这两个查询找到一个解决方案来让它工作吗?
我也希望看到其他更具创造性的方法来尝试我所要求的!

voj3qocg

voj3qocg1#

我会用一个 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 仅返回一行,如果 ROW_COUNT() = 0 是真的,只有当 UPDATE 不匹配任何行。

相关问题