MYSQL查询用于更新多个重复字段条目

时间:2015-06-23 08:18:24

标签: mysql mysql-workbench

以下是我正在处理的示例表

表1

╔════╦══════════════╦══════╗
║ KID║  REV         ║ REDO ║
╠════╬══════════════╬══════╣
║  1 ║ 43453453345  ║  2   ║
║  1 ║ 2433423423   ║  1   ║
║  2 ║ 23423423     ║  1   ║
║  2 ║ 5566533      ║  2   ║
╚════╩══════════════╩══════╝

我需要将 REV KID REDO 插入表1 ,并在插入时插入 KID REDO 的重复条目我需要更新 REV 。   我尝试使用 ON DUPLICATE KEY UPDATE ,但我有两个不是主要的字段。 如何使用普通的mysql实现这一点?请帮帮我

1 个答案:

答案 0 :(得分:1)

您可以创建在插​​入之前触发的触发器,并检查KID和REDO ID是否已存在。如果它们存在则执行更新。

触发器可以看起来像这样:

delimiter //
CREATE TRIGGER upd_check BEFORE INSERT ON table1
FOR EACH ROW
  BEGIN
    SET rev = SELECT REV 
              FROM table1 as t 
              WHERE t.KID = NEW.KID 
              AND t.REDO = NEW.REDO;
    IF rev != NEW.REV THEN
     UPDATE table1
     SET REV = NEW.REV 
     WHERE KID = NEW.KID 
     AND REDO = NEW.REDO;
    END IF;
  END;//
delimiter ;

但是在更新之后,插入仍然会发生,这就是你应该创建的原因 REDO和KID的唯一索引。因此,如果您插入重复项,则会收到错误,然后触发器将更新REV。

CREATE UNIQUE INDEX unique_table1_idx on table1 (KID, REDO)

如果SQL查询的结果不为null,则另一种方法是发送信号并中止插入。这意味着插入将创建一个重复的条目。

signal sqlstate '45000' set message_text = 'duplicate insert';