mysql 触发器 怎么用?

兄弟你好,我在某个项目做数据库的时候掉进了一个大坑。
说起来:当时我在一家小公司做数据库管理员,我们公司当时用的是MySQL数据库。
这时候就需要在删除表中的记录时触发一些操作,比如:B.日志记录。
这让我很困惑,很长一段时间都无法理解。

当时,我按照你提到的第一步,首先检查了我的MySQL版本号。
原来我们使用的是 MySQL 5 .1 版本,它恰好支持触发器。
然后我在计算机的命令行中输入“mysql --version”,果然,我看到了版本号。

然后我将按照您的第二步准备创建触发器。
我找到了需要编辑的表,然后在设计视图中查找触发器选项。
我记得因为当时不太懂触发器所以打开了一个新选项卡,于是查了资料,发现可以在触发器中写代码。

我按照您提到的步骤操作,将触发器命名为“datri”,然后在触发器选项中选择“BEFORE DELETE”,以便它可以在删除过程之前触发。
我还选择了“INSERT”、“UPDATE”和“DELETE”,因为我认为将来可能会有不同的需求。

接下来,我在下面的定义字段中写下了我想要执行的操作。
写完之后,我很仔细的看了SQL预览,确定没有问题,然后保存了。
当时我非常自豪,认为我已经成功了。

但是后来我尝试了一下,发现执行删除操作时触发器根本没有运行。
我一头雾水,查了好久代码。
最后我发现我没有在数据库中创建相应的存储过程。
结果,触发器找不到要执行的操作。

所以兄弟,你在处理数据库的时候一定要小心,不要像我一样迷茫。
这里需要提醒您的是,如果您在不同的数据库中创建触发器,步骤可能会有所不同。
还要确保快门按钮中的操作正确,否则就会像我一样白费力气。
😂

mysql触发器的三种触发事件

之前,它会在数据更改之前触发。
例如,如果您在将一条数据输入表之前插入一条数据,则触发器将首先触发。
检查此数据是否正确,例如密码强度不够或用户无法更改此字段。
2 008 年,当我第一次开始使用数据库时,我遇到了这个东西。
客户必须保存手机号码并加1 ,否则外部系统无法匹配。
只需向 BEFORE 触发器加 1 即可。
非常实用。

AFTER 表示数据已更改并输入到表中,并在那一刻触发。
例如,插入数据后,您需要发送电子邮件通知管理员。
或者,如果您更新库存,则需要将其与缓存同步。
去年在一个电商项目中,更新订单状态后,我使用AFTER触发器调用消息队列,以便后续服务可以收到通知。
这必须在确认并更改数据后完成。
否则,如果程序报错,发送通知后你会感到困惑。

INSTEADOF是最特殊的操作,它直接杀死原来的操作。
比如用户想要插入部分数据,但是触发器说:不行,我给你改一下操作。
我以前在银行系统中见过这种情况。
当用户检查余额时,INSTEADOF 触发器首先检查风险控制系统。
如果风险高的话,连余额都不检查就直接返回拒绝。
完全绕过原来的操作。
此力量威力强大,需谨慎使用。
当Oracle在2 003 年首次推出这个功能时,很多人不理解,从而导致了很多bug。

老实说,如果你使用得比较频繁,你就会知道在哪个场景使用哪个。
然而,当我研究它时,它确实变得有点混乱,尤其是INSTEADOF,这似乎与数据库的原始逻辑相矛盾。
但当你有某些特殊需求,比如数据同步、权限控制时,它就特别好用。

mysql触发器的作用

哎呀,2 02 2 年我在这个城市接了一个项目,需要使用MySQL触发器。
这东西真是太神奇了。
当数据发生变化时,它可以自动采取行动。
例如,如果我需要确保用户名在用户表中是唯一的,我需要一个触发器。

我当时就很困惑,这个触发器怎么用?后来我才意识到我首先必须定义触发器类型,例如插入之前或之后。
然后,您需要编写触发器文本及其包含的 SQL 语句。
这个触发器就像一个小脚本,所有要完成的任务都必须写下来。

例如,我编写了一个名为“unique_username”的触发器,该触发器在插入数据之前触发。
我检查,如果用户名已经存在,那么我必须报告错误并阻止此插入。
代码如下所示:
创建触发器 unique_username 插入用户之前 对于每一行 开始 IF EXISTS(SELECT 1 FROM users WHERE username = NEW.username) THEN SIGNAL SQLSTATE '2 3 000' SET MESSAGE_TEXT = '用户名已存在'; 结束如果; 结束;
这段代码的意思是,如果user表已经有和新插入的数据相同的用户名,我就会报错说用户名已经存在。
很简单,对吧?这个触发器是数据库中的一个小助手,可以自动帮助我维护数据的完整性。

SQL数据库中自动更新updateTime

哎呀,我当时确实这么做了。
我来说说我遇到的困难吧。

当时我处理一个项目,使用的是MySQL,数据库版本大概是5 .7 当时有一个要求,每条记录必须有一个更新的时间戳,而且不能手动更改。
我正在考虑使用MySQL的这个功能,很简单。

看看这个建表方法:
sql 创建表顺序( ID不是绝对零自增, order_date DATETIME NOT NULL 默认 CURRENT_TIMESTAMP, update_time DATETIME 更新 CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 主键(ID) ) 引擎=innodb 默认字符集=utf8 mb4 ;
update_time,查看 DEFAULT CURRENT_TIMESTAMP 到 UPDATE CURRENT_TIMESTAMP,将这两个一起使用就完成了。
插入新行时,update_time会自动填入当前时间;稍后当您更改数据时,即使您更改了产品的价格,update_time 也会立即更新为数据更改时的当前时间。
非常无忧无虑。

我试了一下,输入了一条数据。
update_time是插入的时间。
两天后,我手动更改了订单状态,然后检查了此数据。
update_time又变了,这是变化后的状态时间。
没错,什么也没发生。

后来我过渡到一个使用PostgreSQL 1 2 版本的新项目,当时需求又变了,需要添加最后更改记录的人的信息。
MySQL的简单语法在PostgreSQL中不起作用,必须使用触发器。

我首先创建了一个函数:
sql 创建或更改函数update_time_trigger() 返回触发器为 $$ 开始 NEW.update_time = CURRENT_TIMESTAMP; 返回新的; 结束; $$ 语言 plpgsql;
然后创建触发器:
sql 为 update_time_first_update 创建触发器 更新订单之前 对于每行 执行函数update_time_trigger();
你看,这个触发器是在update之前,也就是说每次更新记录之前,执行这个函数,把update_time改为当前时间。

创建表后,我尝试更新数据,update_time发生了变化。
但后来发现PostgreSQL的触发器每次更新的时候都需要调用这个函数。
直接在字段定义中执行此操作比在 MySQL 中更容易,但性能肯定较慢。
特别是当表数据量很大时,这个触发器就成为瓶颈。

后来我想了一下,如果我添加一个update_by字段来记录谁更改了它,我就必须创建另一个触发器:
sql 创建或替换函数 update_info_trigger() 返回触发器为 $$ 开始 NEW.update_time = CURRENT_TIMESTAMP; NEW.updated_by = current_user; -
假设您的用户表中有一个 update_by 字段 返回新的; 结束; $$ 语言 plpgsql;
你看,这个函数中多了一行,在update_by中填写了当前用户。
但这样一来,每次更新就要做两件事,对性能的影响会更加明显。

所以你看,使用MySQL的解决方案简单高效,适合大多数情况。
PostgreSQL的方案很灵活,但是你得自己做,而且还要考虑性能问题。
我为这个问题争论了好几天,这已经足够了。

您只需要使用需要根据数据库和您的要求选择合适的解决方案。
不要乱搞,它简单易用。