MySQL - 触发删除以前的记录

时间:2013-01-11 15:29:42

标签: mysql triggers

我正在尝试创建一个只允许数据库中有一条记录的触发器,因此会删除之前的所有记录。 但是目前,它不允许我插入任何东西,因为它会被立即删除。

DELIMITER $$
CREATE TRIGGER test_insert 
BEFORE INSERT ON test
FOR EACH ROW BEGIN
DELETE FROM test WHERE id = NEW.id - 1;
END$$

如何删除以前(或以前所有)插入的记录?

2 个答案:

答案 0 :(得分:2)

“但是目前,它不允许我插入任何内容,因为它会被立即删除。”

在执行INSERT时,执行触发器应该抛出异常:

Error Code: 1442
Can't update table 'test' in stored function/trigger because it is
  already used by statement which invoked this stored function/trigger.

(除非在较新版本的MySQL中有些根本不同。)


您要执行的操作(即从您插入的同一表中删除行)无法在MySQL触发器中完成。

您可以使用UNIQUE KEY和BEFORE INSERT触发器的组合来防止插入多行。 BEFORE INSERT触发器可以设置具有唯一的列的值 键上它是一个静态值,然后INSERT语句将抛出一个重复键(“重复条目”)异常。

然后,您可以使用INSERT ... ON DUPLICATE KEY UPDATE ...语句来更新唯一ID之外的列值,例如

CREATE TRIGGER `test_insert` BEFORE INSERT ON test
FOR EACH ROW BEGIN
   SET NEW.id := 1;
END

ALTER TABLE test ADD UNIQUE KEY (id);

INSERT INTO test (somecol) VALUES ('someval')
ON DUPLICATE KEY UPDATE somecol = VALUES(somecol) ;

答案 1 :(得分:0)

要做到这一点,首先需要找到一个你要删除所有值并插入的值。这样您就不需要触发器,只需删除所有先前的情况,然后添加新行。除非由于某些原因从您的代码中无法解释,否则您需要一个触发器,循环中的简单解决方案可以起作用:

$query = mysql_query("DELETE FROM test WHERE id = NEW.id -1");
$new_id = $new.id -1;
$query2 = mysql_query("INSERT INTO test VALUES('$new_id','$var1','$var2'));