我正在尝试创建一个触发器,它只允许数据库中的一条记录,因此它将删除任何以前的记录。但目前,它不允许我插入任何内容,因为它会立即被删除。
DELIMITER $$
CREATE TRIGGER test_insert
BEFORE INSERT ON test
FOR EACH ROW BEGIN
DELETE FROM test WHERE id = NEW.id - 1;
END$$
如何删除以前(或所有以前)插入的记录?
“但目前,它不允许我插入任何内容,因为它会立即被删除。”
实际上,当您执行 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) ;
为此,您首先需要找到一些要删除所有并插入的值。这样您就不需要触发器,您只需删除所有以前的案例,然后添加一个新行。除非由于某种原因无法从您的代码中解释,否则您需要一个触发器,循环中的一个简单解决方案可以工作,例如:
$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'));