mysql - 用于在更新之前检查重复项的 SQL 语法(不是 DUPLICATE KEY UPDATE)

标签 mysql sql

如果两个非关键字段匹配,我有一个语法问题,尝试UPDATE。 -- INSERT 如果不匹配。

首先我要说的是,我有一个有效查询,其中涉及 SELECTON DUPLICATE KEY UPDATE。现在我只是好奇,可以用不同的方式来做吗?

出于纯粹的好奇,我正在以不需要主键的方式尝试此操作。这实际上只是一个实验,看看是否可以完成。

我想要的是 ON DUPLICATE KEY UPDATE - 但是:

  1. 假设我不知道 key ,并且
  2. 假设我无法通过 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/

相关文章:

mysql - 将 MySQL 中的多行儒略日期转换为公历日期

mysql - 具有多个条件和子选择的 SQL 查询

mysql - 连接Mysql服务器在两个数据库上运行任务

mysql - 如何保持多语言数据和树结构的版本化?

php - MYSQL 仅在 INT(11) PHP 时,如果数字长度为 6 位才运行查询

sql - 如何获得SQLite中X列与Y列的比率?

sql - Sql中的AVG - float 问题

sql - 如果外键的列设置为 false,Postgres 将删除一行

java - org.h2.jdbc.JdbcSQLException : Table "PACCHETTIVISITETURISTICHE" not found; SQL statement:

mysql - 尝试在 Mysql 中创建存储过程时出现语法错误?