1

是否可以创建一个触发器来侦听一个数据库连接/实例(所有模式)的任何插入或更新?

这是我的商业案例:

  • 我在一台 MySQL 服务器上有多个模式。
  • 这些模式中的每一个都有多个表。
  • 所有表都有一个“lastChanged”日期时间列。
  • 每当在该表上发生更新或插入时,我都需要更新该表中的“lastChanged”列。

总而言之,我正在寻找是否可以创建一个全局规则来实现它,因此我不需要在每个模式中为每个表创建触发器。

我对触发器没有太多经验,因此,如果您将触发器以外的其他东西视为捕获这些事件并更新相应表中的行的答案,那也是一个绝妙的答案!

4

1 回答 1

1

你不能用一个触发器来做到这一点。

但是,如果您将lastChanged列从更改为DATETIMETIMESTAMP则可以使用该DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP功能在任何插入或更新时自动设置值。

一个权衡是TIMESTAMP数据类型只能支持从 1970 到 2038 的值,因此如果您需要存储该范围之外的值,则不能使用它。

由于您希望使其尽可能简单,并且您说所有表都已经有一个名为 的列lastChanged,您可以考虑使用information_schema来生成您需要的 alter table 语句,然后一次执行它们。

像这样的东西:

select concat('alter table ',
   t.table_schema,
   '.',
   t.table_name,
   ' modify column ',
   c.column_name,
   ' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;') as ddl
into outfile '/tmp/lastChanged.sql'
from information_schema.columns c
  inner join information_schema.tables t 
    on t.table_schema = c.table_schema and t.table_name = c.table_name
where c.table_schema = database()
and c.data_type = 'datetime'
and c.column_name = 'lastChanged'
and t.table_type = 'base table';

\. /tmp/lastChanged.sql
于 2013-04-16T21:25:04.707 回答