我创建了一个表
数据库名称 - 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上搜索时,我发现了很多同样错误的问题。但无法解决我的问题。我无法更新行的原因是什么?
答案 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)
错误本身会告诉您答案。这是因为,您无法使用正在执行触发器的同一个表。您需要将审核日志存储到不同的表中。