Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql语法的问题_Sql_Mysql_Triggers_Mysql Error 1064 - Fatal编程技术网

mysql语法的问题

mysql语法的问题,sql,mysql,triggers,mysql-error-1064,Sql,Mysql,Triggers,Mysql Error 1064,我试图在MySQL上创建一个触发器,但是我遇到了一个语法问题,我没有找到。如果有更多的经验可以帮助我,那将是我第一次使用MySQL 我创建这个触发器的原因是为了删除所有孤立标签,它与服务描述符有多对多关系。这两个实体由服务描述符链接 我的密码是: CREATE TRIGGER `trg_delete_orphan_label` AFTER DELETE FOR EACH ROW ON `restdb`.`service_labels` DELETE FROM `restdb`.`lab

我试图在MySQL上创建一个触发器,但是我遇到了一个语法问题,我没有找到。如果有更多的经验可以帮助我,那将是我第一次使用MySQL

我创建这个触发器的原因是为了删除所有孤立标签,它与服务描述符有多对多关系。这两个实体由服务描述符链接

我的密码是:

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`); 
提前谢谢

你错过了,也错过了

试试这个代码

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`                         
                    );  

你的触发器有几个问题,最明显的是每行的位置,以及当它实际上只是一行时,你对待旧数据的方式

这应该适合您:

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`                        
    );                     

谢谢大家。。。因为你的帮助,我终于解决了这个问题

最后,工作是:

在restdb.service\u描述符上删除后创建触发器trg\u delete\u孤儿\u标签 每行 从restdb.labels中删除 我不在哪里 选择restdb.service\u labels.id\u label
来自restdb.service_标签

我添加了一个和。它仍然有一些语法问题,不过。。。谢谢你的支持!我很高兴你找到了一些有效的方法,尽管我注意到触发器现在在另一张桌子上。您的解决方案在功能和性能方面与我的略有不同。您的触发器将删除所有孤立行,而我的触发器仅删除新孤立行。我的方法也会更快,所以你可能想考虑一下。是的!这是事实。。。问题是,当触发器位于service_labels表上时,它不起作用,即使deleting语句对孤立语句也很有效。。。这是因为服务标签表没有被直接删除。。。它正在被cacade在服务完成后删除。。。因为这个原因,我改变了表格,也因为这个原因,我不得不改变逻辑!