代码之家  ›  专栏  ›  技术社区  ›  Zak

用于在更新之前检查重复项的SQL语法(不是重复的密钥更新)

  •  0
  • Zak  · 技术社区  · 6 年前

    我有一个语法问题 UPDATE non key 字段匹配。-- INSERT 如果不匹配。

    工作查询 这涉及到 SELECT 带着 ON DUPLICATE KEY UPDATE . 现在我只是好奇,能不能换个方式?

    primary key . 这真的只是一个实验,看看能不能做到。

    我想要的是 喜欢 重复密钥更新时 --但是:

    1. key ,和
    2. 我们假装我 不能得到 一把钥匙 选择

    以下是我的数据结构:

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

    现在我要做的是 没有选择 无重复密钥更新 是——如果 contractor_id email_type_id 匹配-- 更新 这个 email_address --其他 插入 .

    如果尝试过这个--(我知道我打破了自己的不选择规则):

    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 声明。我也不想用 选择 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');
    

    但我不明白为什么这个不起作用。这只是一个练习,看看如何创造性地使用这种类型的查询。我认为我的这两个想法都是可行的——有人能为这两个查询找到一个解决方案使之生效吗?

    我也很乐意看到其他更有创意的方法来尝试我的要求!

    1 回复  |  直到 6 年前
        1
  •  1
  •   dossy    6 年前

    我会用一个 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

    我的想法是你做 首先,然后是 INSERT ... SELECT 在哪里 SELECT 只返回一行 如果 ROW_COUNT() = 0 更新 没有匹配任何行。