【问题标题】:MySQL - Trigger to delete previous recordMySQL - 触发器删除以前的记录
【发布时间】:2013-01-11 15:29:42
【问题描述】:

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

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

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

【问题讨论】:

  • 你能给出期望结果的样本记录吗?

标签: mysql triggers


【解决方案1】:

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

实际上,当您执行 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) ;

【讨论】:

    【解决方案2】:

    为此,您首先需要找到要删除所有内容并插入的某个值。这样您就不需要触发器,您只需删除所有以前的案例,然后添加一个新行。除非由于某种原因无法从您的代码中解释,否则您需要一个触发器,循环中的一个简单解决方案可以工作,例如:

    $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'));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 2015-11-11
      • 1970-01-01
      相关资源
      最近更新 更多