我有两个表concept_access和concept_access_log。我想创建一个触发器,该触发器在每次从concept_access中删除某些内容时都起作用,请检查日志表中是否存在类似的记录,如果不存在,请在从concept_access中删除之前插入新的记录。
我修改了触发器,现在看起来像这样:
DROP TRIGGER IF EXISTS before_delete_concept_access; DELIMITER // CREATE TRIGGER before_delete_concept_access BEFORE DELETE ON `concept_access` FOR EACH ROW BEGIN IF (SELECT 1 FROM concept_access_log WHERE map=OLD.map AND accesstype=OLD.accesstype AND startdate=OLD.startdate AND stopdate=OLD.stopdate) IS NULL THEN INSERT INTO concept_access_log (map, accesstype, startdate, stopdate) VALUES (OLD.map, OLD.accesstype, OLD.startdate, OLD.stopdate); END IF; END// DELIMITER ;
删除之前,concept_access中的样本数据:
map accesstype startdate stopdate 1 public NULL NULL 1 loggedin 2011-05-11 NULL 1 friends NULL NULL
日志表已经有前2行。它们与concept_access中的完全相同。当我从concept_access表中删除第一行时,我在日志表中得到了这一行:
map accesstype startdate stopdate 1 public NULL NULL 1 loggedin 2011-05-11 NULL 1 friends NULL NULL 1 public NULL NULL
尽管不应该插入任何内容,因为(1,public,null,null)已经存在。
该表没有主键。我不是在创建结构,所以不要问我为什么。对其进行更改将破坏许多现有功能。我只需要保留从表中删除的concept_access内容的日志,并将其存储在日志中即可,没有重复项。
concept_access
如果有人能找出问题所在,我将不胜感激。
DROP TRIGGER IF EXISTS before_delete_concept_access; DELIMITER // CREATE TRIGGER before_delete_concept_access BEFORE DELETE ON `concept_access` FOR EACH ROW BEGIN IF (SELECT COUNT(*) FROM concept_access_log WHERE map=OLD.map AND accesstype=OLD.accesstype AND startdate=OLD.startdate AND stopdate=OLD.stopdate) = 0 THEN INSERT INTO concept_access_log (map, accesstype, startdate, stopdate) VALUES (OLD.map, OLD.accesstype, OLD.startdate, OLD.stopdate); END IF; END// DELIMITER ;
我没有使用not exists,只是测试匹配数是否大于0
not exists
您的代码在我的机器上运行良好,您的MySQL版本是什么?
mysql> select version(); +------------+ | version() | +------------+ | 5.1.56-log | +------------+ 1 row in set (0.00 sec)