Mysql 如何处理触发器中的冲突问题?

Mysql 如何处理触发器中的冲突问题?,mysql,sql,triggers,phpmyadmin,Mysql,Sql,Triggers,Phpmyadmin,我在表上有一个触发器(更新前),如下所示: UPDATE contact_us SET updated_at = unix_timestamp() WHERE id = new.id 当我使用phpMyadmin更新该表的一行时,它抛出以下错误: 要更清楚地看到这一点: #1442-无法更新存储函数/触发器中的表“contact_us”,因为调用此存储函数/触发器的语句已使用该表 我怎样才能解决这个问题 首先,这个功能根本不需要触发器,只需使用timestamp或datetime字段。因此,

我在表上有一个触发器(更新前),如下所示:

UPDATE contact_us SET updated_at = unix_timestamp() WHERE id = new.id
当我使用phpMyadmin更新该表的一行时,它抛出以下错误:

要更清楚地看到这一点:

#1442-无法更新存储函数/触发器中的表“contact_us”,因为调用此存储函数/触发器的语句已使用该表

我怎样才能解决这个问题

  • 首先,这个功能根本不需要触发器,只需使用timestamp或datetime字段。因此,在处定义
    updated\u如下:

    updated_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    
  • 如果出于任何原因坚持使用触发器,即使这样,也不要使用单独的
    update
    语句来更新定义了触发器的同一个表,因为这是一个不可能的循环。使用
    NEW
    关键字访问新创建记录的字段以修改字段内容:

    set NEW.updated_at = unix_timestamp();
    

  • 也许还可以出示触发器?@FMashiro show store procedure?@Ravi我没有!我认为您正在创建一个无限循环,因为您的触发器与您试图运行的SQL语句相同。因此,触发器会运行,因为它会运行,所以它也会调用自身,等等。当创建一行而不是更新一行时,第一种方法会起作用。@stack然后根据文档建议,在更新当前时间戳时将
    添加到字段定义中。我把它添加到了答案中。听起来不错,但是我现在如何才能在更新当前时间戳时为
    更新行添加
    ?我的意思是,当前已经创建了表。我需要
    alter
    ?@stack好的,你可以通过说abracadabra来尝试,但可能一个alter表就可以了。使用您最喜欢的MySQL管理器GUI编辑字段定义。好的,我在phpMyadmin中找到了一个选项,它可以帮我编辑字段定义。但是该列的数据类型是
    int(11)
    ,我需要在其中存储
    unix\u timestamp()
    (这是一个秒序列),而不是
    CURRENT\u timestamp
    。你知道吗?向上投票