0

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

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

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

4

2 回答 2

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) ;
于 2013-01-11T16:06:49.477 回答
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'));
于 2013-01-11T15:41:06.287 回答