INSERT ON DUPLICATE KEY和UPDATE后记录数据

时间:2018-03-18 01:42:15

标签: mysql sql

我有一个庞大的订阅者信息数据库。新用户加入,有些人改变他们的信息,有些人取消。我想在每次更新订阅者文件时跟踪这些更改。我从不删除已取消的订阅,我将其“资格”变为虚假。

这是我创建的测试数据库的“当前”快照。我要将'医生'改为'上校',将律师的资格设为假,然后将'RN'改为'BSN'并将他的电话号码从'444-5555'改为'444-1234'

enter image description here

以下是更新后的订阅者列表:

Updated Subscribers

这两个SQL语句我背对背地执行UPDATES和INSERT

查询1

 INSERT INTO test_existing (test_existing.emp_id, test_existing.title, 
 test_existing.phone, test_existing.eligible)
   SELECT t.emp_id, t.title, t.phone, t.eligible from test_new t
   ON DUPLICATE KEY UPDATE test_existing.emp_id =t.emp_id, 
   test_existing.title = t.title, test_existing.phone =t.phone;

查询2

UPDATE test_existing
SET test_existing.eligible = 'FALSE' where test_existing.emp_id not in 
 (select test_new.emp_id from test_new)

这些查询会生成一个包含所有更改的表:

Data Log after Update and Insert

我运行一系列简单的mySQL触发器来捕获更改。他们在这里:

CREATE TRIGGER `after_insert_test` AFTER INSERT ON `test_existing`
  FOR EACH ROW BEGIN
    INSERT INTO data_log (action, timestamp,emp_id, title, phone, eligible)
    VALUES('after_insert', NOW(),NEW.emp_id,NEW.title, NEW.phone, NEW. 
    eligible);
END

CREATE TRIGGER `after_update_test` AFTER UPDATE ON `test_existing`
 FOR EACH ROW BEGIN
    INSERT INTO data_log (action, timestamp,emp_id, title, phone, eligible)
    VALUES('after_update', NOW(),NEW.emp_id,NEW.title, NEW.phone, NEW. 
    eligible);
END

CREATE TRIGGER `before_insert_test` BEFORE INSERT ON `test_existing`
   FOR EACH ROW BEGIN
    INSERT INTO data_log (action, timestamp,emp_id, title, phone, eligible)
     VALUES('before_insert', NOW(),NEW.emp_id,NEW.title, NEW.phone, NEW. 
     eligible);
END

CREATE TRIGGER `before_update_test` BEFORE UPDATE ON `test_existing`
  FOR EACH ROW BEGIN
    INSERT INTO data_log (action, timestamp,emp_id, title, phone, eligible)
    VALUES('before_update', NOW(),NEW.emp_id,NEW.title, NEW.phone, NEW. 
    eligible);
END

这些触发器生成此数据日志文件

Data Log File

很多信息 - 有些信息很有用,有些则不然。但我本来希望看到'上校'为'上校'为'医生','之前'更新律师的资格为'真'而不是'假' - 同样适用于BSN和电话号码。

是因为执行了我的两个查询的顺序,还是触发器的执行顺序?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

In your before update trigger use OLD instead of NEW:
CREATE TRIGGER `before_update_test` BEFORE UPDATE ON `test_existing`
FOR EACH ROW BEGIN
INSERT INTO data_log (action, timestamp,emp_id, title, phone, eligible)
VALUES('before_update', NOW(),OLD.emp_id,OLD.title, OLD.phone, OLD. 
eligible);
END

NEW指的是要插入的新值。 OLD指的是现有值。