是否可以修改 MySQL 中现有的触发器定义?

Ale*_*lex 22 mysql trigger update

我想知道是否可以更新 MySQL 中的触发器定义。例如,我有一个触发器 T,我想向它添加一些新功能。

我的假设是我需要删除并重新创建它。

对于此类场景,数据库管理的最佳实践是什么?

Mic*_*bot 30

听起来您好像在问是否可以在原子操作中更改触发器,如果​​新定义失败,您不会丢失旧CREATE OR REPLACE VIEW定义...类似于,如果新定义替换视图定义是有效的,但如果您无法更换它,则会保留旧的。

不幸的是,MySQL 中没有ALTER TRIGGERor CREATE OR REPLACE TRIGGER

我建议最好的做法是锁定触发器所在的表,这样在没有触发器的情况下不会影响任何行。允许在表锁定时删除和添加触发器。

mysql> LOCK TABLES t1 WRITE; -- the next prompt appears once you've obtained the lock
mysql> DROP TRIGGER t1_bi; 
mysql> DELIMITER $$
mysql> CREATE TRIGGER ti_bi BEFORE INSERT ON t1 FOR EACH ROW 
       BEGIN
       ...
       END $$
mysql> DELIMITER ;
mysql> UNLOCK TABLES;
Run Code Online (Sandbox Code Playgroud)

更新:MariaDB 在 10.1.4 版中添加CREATE OR REPLACE TRIGGER了对 MySQL 的替代品的支持。

https://mariadb.com/kb/en/mariadb/create-trigger/

从 5.7 开始,Oracle 的 MySQL 仍然依赖于上述解决方案。

  • “从 5.7 开始,Oracle 的 MySQL 仍然依赖于上述解决方案”——在 8.0 版本中仍然如此 (6认同)