当'BEFORE UPDATE'触发器触发时,如何更新MySQL表行?

时间:2017-07-10 09:05:51

标签: mysql triggers

我创建了一个表

数据库名称 - mytrigger;
表名 - employee_audit

use mytrigger;
create table employee_audit(
     id int auto_increment primary key,
     employeeNumber int not null,
     lastName varchar(50) not null,
     changee datetime default null,
     action varchar(50) default null
    );

之后,我创建了一个更新触发器

我的触发器名称是

before_employees_update

DELIMITER $$
create trigger before_employees_update
before update on employee_audit
for each row
begin
insert into employee_audit
set action ='update',
employeeNumber = OLD.employeeNumber,
lastName = OLD.lastName,
changee = now();
end$$
DELIMITER ;

之后,我使用此命令在表中插入值 - >

insert into employee_audit values(1,112,'prakash','2015-11-12 15:36:20' ,' ');
  

之后,我想更新我的表行,其中id = 1

update employee_audit set lastName = 'Sharma' where employeeNumber =112;

但是没有执行给出错误

  

错误1442(HY000):无法更新已存储的表'employee_audit'   函数/触发器,因为它已被调用的语句使用   这个存储的函数/触发器。

当我在Google上搜索时,我发现了很多同样错误的问题。但无法解决我的问题。我无法更新行的原因是什么?

2 个答案:

答案 0 :(得分:1)

我的建议是,您可以创建一个public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ViewHolder> { public List<Event> events = null; private final ListFragment.OnFragmentInteractionListener mListener; public ListAdapter(List<Event> events, ListFragment.OnFragmentInteractionListener mListener) { this.events = events; this.mListener = mListener; } @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { LayoutInflater layoutInflater = LayoutInflater.from(viewGroup.getContext()); ViewDataBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.cell, viewGroup, false); return new ViewHolder(binding); } @Override public void onBindViewHolder(ViewHolder viewHolder, final int position) { final Event event = events.get(position); viewHolder.bind(event); viewHolder.binding.getRoot().setOnClickListener(v -> { if (null != mListener) { mListener.onFragmentInteraction(event); } }); } @Override public int getItemCount() { return events.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { private final ViewDataBinding binding; public ViewHolder(ViewDataBinding binding) { super(binding.getRoot()); this.binding = binding; } public void bind(Object obj) { binding.setVariable(BR.data,obj); binding.executePendingBindings(); } } } ,例如log table

在主表中的每次插入或更新中,您都可以在此表中创建新条目或更新现有记录。

此外,您可以将employee_audit_LOG添加到该updated_timestamp column表中,以保持特定记录何时更新。

答案 1 :(得分:1)

错误本身会告诉您答案。这是因为,您无法使用正在执行触发器的同一个表。您需要将审核日志存储到不同的表中。