【问题标题】:Problems with mysql syntaxmysql语法问题
【发布时间】:2011-03-04 23:40:15
【问题描述】:

我正在尝试在 MySQL 上创建触发器,但我遇到了语法问题,我无法找到。如果有更多经验的人可以帮助我,那就太好了(这是我第一次使用 MySQL!)...

我创建此触发器的原因是为了删除所有与“service_descriptor”具有多对多关系的孤立“标签”(这两个实体由 service_labels 链接)。

我的代码是:

CREATE TRIGGER `trg_delete_orphan_label` AFTER DELETE 
FOR EACH ROW ON `restdb`.`service_labels`  
  DELETE FROM `restdb`.`labels`
   WHERE EXISTS (SELECT *
                   FROM old D 
              LEFT_JOIN `restdb`.`service_labels` SL ON SL.`id_label` = D.`id_label` 
                                                    AND D.`id_service` = SL.`id_service`
                  WHERE SL.`id_label` IS NULL
                        `restdb`.`labels`.`id` = D.SL.`id_label`); 

提前致谢!

【问题讨论】:

    标签: sql mysql triggers mysql-error-1064


    【解决方案1】:

    你错过了AND

    试试这个代码

    CREATE TRIGGER `trg_delete_orphan_label` AFTER DELETE FOR EACH ROW ON `restdb`.`service_labels`   
        DELETE 
        FROM 
            `restdb`.`labels` 
        WHERE 
            EXISTS (SELECT 
                        * 
                    FROM 
                        old D LEFT_JOIN 
                        `restdb`.`service_labels` SL ON 
                            SL.`id_label` = D.`id_label` AND 
                            D.`id_service` = SL.`id_service` 
                    WHERE 
                        SL.`id_label` IS NULL AND
                        `restdb`.`labels`.`id` = D.SL.`id_label`                         
                        );  
    

    【讨论】:

    • 我添加了一个和。不过,它仍然存在一些语法问题...感谢您的支持!
    【解决方案2】:

    您的触发器存在一些问题,最明显的是“FOR EACH ROW”的位置,以及您将 OLD 视为表格的方式,而实际上它只是一行。

    这应该适合你:

    DROP TRIGGER IF EXISTS `trg_delete_orphan_label`;
    
    CREATE TRIGGER `trg_delete_orphan_label` AFTER DELETE ON `service_labels` 
    FOR EACH ROW
        DELETE FROM `labels`
        WHERE `id` = OLD.`id_label`
        AND NOT EXISTS (
            SELECT NULL
            FROM `service_labels` SL 
            WHERE SL.`id_label` = `labels`.`id`                        
        );                     
    

    【讨论】:

      【解决方案3】:

      谢谢大家...由于您的帮助,我终于解决了...

      最后的工作是:

      删除后创建触发器trg_delete_orphan_labelrestdb.service_descriptor
      每一行 从restdb.labels 删除 在哪里id不在( 选择restdb.service_labels.id_label 来自restdb.service_labels);

      【讨论】:

      • 我很高兴你找到了一些有用的东西,尽管我注意到触发器现在在不同的表上。从功能和性能的角度来看,您的解决方案与我的解决方案略有不同。您的触发器正在删除所有孤儿,而我的触发器只删除新的孤儿行。我的方法也会更快,所以你不妨考虑一下。
      • 是的!这是事实......问题是当触发器在 service_labels 表上时它不起作用,即使删除语句​​对孤立的语句很有效......这是因为 service_labes 表没有被直接删除......它在 service_descriptor 之后被 cacade 删除...因此我更改了表,因此我也必须更改逻辑!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      相关资源
      最近更新 更多