0
目前,我有许多触发器可以做同样的事情。这是复制粘贴每个需要此功能的表。自动填充存储过程中的列值,通过触发器调用
delimiter $$
create trigger user_before_insert before insert on user for each row
begin
set NEW.create_time = CURRENT_TIMESTAMP;
set NEW.create_user_id = @user_id;
set NEW.modify_time = CURRENT_TIMESTAMP;
set NEW.modify_user_id = @user_id;
end$$
create trigger user_before_update before update on user for each row
begin
set NEW.modify_time = CURRENT_TIMESTAMP;
set NEW.modify_user_id = @user_id;
end$$
是否有可能换行修改OLD
和/或NEW
成通过触发器调用存储过程的线路?事情是这样的:
delimiter $$
create procedure autofill_on_insert(inout NEW data_type) -- what would be the data_type?
begin
set NEW.create_time = CURRENT_TIMESTAMP;
set NEW.create_user_id = @user_id;
set NEW.modify_time = CURRENT_TIMESTAMP;
set NEW.modify_user_id = @user_id;
end$$
create procedure autofill_on_update(inout NEW data_type) -- what would be the data_type?
begin
set NEW.modify_time = CURRENT_TIMESTAMP;
set NEW.modify_user_id = @user_id;
end$$
delimiter ;
create trigger user_before_insert before insert on user
for each row call autofill_on_insert(NEW);
create trigger user_before_update before update on user
for each row call autofill_on_update(NEW);
其他问题:如果这是可能的,有没有什么办法来检查是否NEW
包含特定的列?有些表格没有modify_time
和modify_user_id
。
我可以将'current_timestamp'设置为'create_time'的默认值,但这还不够 - 问题是如果我将它用于'create_time',我不能将它设置为'on update' modify_time'。我也不能将'@ user_id'设置为'create_user_id'和'modify_user_id'的'default'或'update'值。 – binaryLV 2011-04-08 09:25:47
是的,只有一个TIMESTAMP ON UPDATE字段必须是。但是你可以用ON UPDATE子句添加特殊的TIMESTAMP字段(这将是第一个TIMESTAMP字段);为modify_time和create_time字段设置DEFAULT NULL;那么(当选择modify_time或create_time数据时)如果值为null,则引用该TIMESTAMP ON UPDATE字段。 – Devart 2011-04-08 09:42:41