我正在尝试创建一个只允许数据库中有一条记录的触发器,因此会删除之前的所有记录。 但是目前,它不允许我插入任何东西,因为它会被立即删除。
DELIMITER $$
CREATE TRIGGER test_insert
BEFORE INSERT ON test
FOR EACH ROW BEGIN
DELETE FROM test WHERE id = NEW.id - 1;
END$$
如何删除以前(或以前所有)插入的记录?
答案 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'));