6

我想让 MySQL 表中的行不可变,一旦插入它们,我不希望它可以更改它们。我怎样才能做到这一点?

(如果尝试任何更改,理想情况下会返回合适的错误消息)。

我没有授予权限,所以我想了解如何编写BEFORE UPDATE引发错误的触发器(使用信号或发出总是失败的语句)。

我使用 MySQL v5。

4

2 回答 2

7

一个非常简单的触发器应该可以做到;

CREATE TRIGGER stop_update BEFORE UPDATE ON table1
FOR EACH ROW
  SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Update not allowed!'
//

一个用于测试的 SQLfiddle。您可以添加更新以进行测试。

当然,您可能希望对DELETE.

编辑:如果您使用的 MySQL 版本低于 5.5 并添加了信号,则可以限制写入(不是很干净)故意导致错误;

CREATE TRIGGER stop_update BEFORE UPDATE ON table1
FOR EACH ROW
  UPDATE UPDATE_OF_TABLE1_IS_NOT_ALLOWED SET value='Update not allowed!'
//

另一个 SQLfiddle。无法在 DDL 中添加错误并让 SQLfiddle 保存它,因此在左侧窗口中将更新的 id 更改为 1(现有行)将使更新失败。

于 2013-05-19T12:50:41.630 回答
0

如果您使用 InnoDB,另一种不使用触发器的解决方案。

创建另一个与其重复的表。新列中的列应该具有指向相关原始表的列的外键(因此是此解决方案中的 InnoDB 要求)。

为每个键设置一个限制ON UPDATE RESTRICT。下面是一列的代码:

CREATE TABLE original (
     ....
     immutable_column ...
     INDEX index1(immutable_column)
     ....
) ENGINE=INNODB;

CREATE TABLE restricter (
     .....
     col1,
     INDEX index2(col1),
     FOREIGN KEY (col1) REFERENCES original (immutable_colum) ON UPDATE RESTRICT ON DELETE CASCADE
) ENGINE=INNODB;

不过,您必须手动插入到这个新表中。

于 2014-07-13T07:27:01.957 回答