【问题标题】:Delete multiple rows based on select根据select删除多行
【发布时间】:2012-03-30 11:35:49
【问题描述】:

我正在尝试创建一个触发器,该触发器将根据另一个表中的选择从一个表中删除行

operatorpositionsoperatorlinepos

positiontagslinepositiontag

operatortagsoperatortag

我的触发器是这样的

CREATE TRIGGER removeOperatorPosition AFTER DELETE ON operatorpositions
    FOR EACH ROW
    BEGIN
        DELETE FROM operatortags WHERE gen = NEW.operator 
            AND tag = (SELECT tag FROM positiontags WHERE position = NEW.pos AND line = NEW.line);            
    END;

问题是一个位置可以有多个标签,因此子查询将返回多行。我需要如何更改它以便它可以与多个标签一起使用?

【问题讨论】:

    标签: mysql subquery


    【解决方案1】:

    如果我理解你,你想删除所有标签。
    所以尝试用IN替换子查询之前的=

    CREATE TRIGGER removeOperatorPosition AFTER DELETE ON operatorpositions
        FOR EACH ROW
        BEGIN
            DELETE FROM operatortags WHERE gen = NEW.operator 
                AND tag IN (SELECT tag FROM positiontags WHERE position = NEW.pos AND line = NEW.line);            
        END;
    

    【讨论】:

      【解决方案2】:
      CREATE TRIGGER removeoperatorposition AFTER DELETE
      ON operatorpositions
      FOR EACH ROW
      BEGIN
        DELETE FROM operatortags
        WHERE  gen = new.operator
               AND tag IN (SELECT tag
                           FROM   positiontags
                           WHERE  position = new.pos
                                  AND line = new.line);
      END; 
      

      = 更改为IN 运算符应该适用于返回多行的子查询

      【讨论】:

      • 是的,感觉很愚蠢,这很容易:) 还不得不将new 更改为old,因为我正在删除
      【解决方案3】:

      更有效的方法是使用连接 -

      CREATE TRIGGER removeOperatorPosition AFTER DELETE ON operatorpositions
          FOR EACH ROW
          BEGIN
              DELETE ot
              FROM operatortags ot
              INNER JOIN positiontags pt
                  ON ot.tag = pt.tag
              WHERE ot.gen = OLD.operator 
              AND pt.position = OLD.pos
              AND pt.line = OLD.line;            
          END;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多