网上真的是 copy 害人, 乱写 自己亲测有效
创建测试表
CREATE TABLE `test_table` (
`uid` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL DEFAULT '',
`age` int(10) NOT NULL DEFAULT '0',
`create_time` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=10003 DEFAULT CHARSET=utf8mb4;
如果触发器已存在则删除
DROP TRIGGER IF EXISTS `test_trigger`;
创建触发器
DELIMITER //
CREATE TRIGGER `test_trigger`
BEFORE UPDATE ON `test_table`
FOR EACH ROW
BEGIN
SET new.name=old.name;
set new.age=old.age;
END //
分析下语句 :
DELIMITER
其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了. 这里 //
就是间隔符
BEFORE UPDATE ON test_table
触发器条件 更新表记录.
set new.name=old.name
这里就很容易理解了, 关键字 new
更新操作中 set 内的数据 , old
就是原有数据
上面触发器 目的就是 监控表 test_table
更新事件, 更新字段用 原有数据 覆盖 新更新数据.
查看触发器
SHOW TRIGGERS;
测试
上面我们已经创建了一张 test_table 表
更新name
和 create_time
字段
update test_table set `name`='xxxxx', create_time=22222 where uid = 10002;
测试结果 很明显, name
修改没成功, 但 create_time
更新成功.
通过触发器 我们就可以限制表内的某个字段, 不允许求改了
上面的方式 还是可以通过 delete insert 的方式绕开限制 . 所以该表需要限制删除. 不授予删除权限.
还有其他方式 禁止修改数据表的某字段. 下篇介绍下.
看不懂的同学 看 https://blog.csdn.net/qq_34246965/article/details/117521347 这篇文章 还挺细的