V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
airycanon
V2EX  ›  MySQL

MySQL 初学者请教触发器问题

  •  
  •   airycanon · 2014-07-23 17:04:41 +08:00 · 3023 次点击
    这是一个创建于 3775 天前的主题,其中的信息可能已经有所发展或是发生改变。
    为了实现某条数据的number字段为0时自动删除该条数据,为product_sell表创建如下的触发器:
    -------------------------------------------------------------------------------------------------------------------
    CREATE TRIGGER number_check AFTER UPDATE ON product_sell
    FOR EACH ROW
    BEGIN
    IF NEW.number=0 THEN DELETE FROM product_sell WHERE OLD.id=NEW.id;
    END IF
    END
    -------------------------------------------------------------------------------------------------------------------

    测试一下,执行下面的语句:
    -------------------------------------------------------------------------------------------------------------------
    UPDATE product_sell SET number=0 WHERE id='df31d0ed-1ecf-496e-996b-8840d834f170';
    -------------------------------------------------------------------------------------------------------------------

    结果该条数据number变为0,但并没有被删除,同时出现如下错误:
    -------------------------------------------------------------------------------------------------------------------
    Can't update table 'product_sell' in stored function/trigger because it is already used by statement
    which invoked this stored function/trigger.
    -------------------------------------------------------------------------------------------------------------------

    Google上述错误后得到的信息是在触发器中使用UPDATE语句导致,但是我触发器中并没有执行UPDATE,另有人说使触发器被触发的对象(上文中product_sell表中数据的更新)和触发器执行时的目标(删除product_sell中number为0的数据)不能为同一张表。


    小弟现在比较迷惑,求大神指条明路,先谢谢了。
    4 条回复    2014-07-24 08:27:49 +08:00
    rainysia
        1
    rainysia  
       2014-07-23 17:11:09 +08:00   ❤️ 1
    不要用触发器. 换成程序逻辑来处理.
    airycanon
        2
    airycanon  
    OP
       2014-07-23 17:14:25 +08:00
    @rainysia 多谢解答,不过我仍然想知道错误的根源是什么。
    iyaozhen
        3
    iyaozhen  
       2014-07-23 19:17:05 +08:00
    好像触发器不是用来做这个事的。
    触发器只能用来插入数据的时候再另外一个表里面也插入数据,删除数据的时候另一个表也删除数据等事情。
    判断某个字段值等于什么的时候执行操作好像不行,这个需要程序来做。
    msg7086
        4
    msg7086  
       2014-07-24 08:27:49 +08:00
    因为你在更新记录的时候把他删了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2817 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 03:59 · PVG 11:59 · LAX 19:59 · JFK 22:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.