我想让 MySQL 表中的行不可变,一旦插入它们,我不希望它可以更改它们。我怎样才能做到这一点?
(如果尝试任何更改,理想情况下会返回合适的错误消息)。
我没有授予权限,所以我想了解如何编写BEFORE UPDATE
引发错误的触发器(使用信号或发出总是失败的语句)。
我使用 MySQL v5。
一个非常简单的触发器应该可以做到;
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(现有行)将使更新失败。
如果您使用 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;
不过,您必须手动插入到这个新表中。