Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.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 使用其他表的列从表中删除_Mysql_Stored Procedures_Mysql Workbench - Fatal编程技术网

Mysql 使用其他表的列从表中删除

Mysql 使用其他表的列从表中删除,mysql,stored-procedures,mysql-workbench,Mysql,Stored Procedures,Mysql Workbench,我创建了一个过程,在这个过程中,我创建了一个临时表来存储列的值,然后我想使用这些列的值来删除其他表中的数据。 如何在while循环中执行此操作,或者简单地使用join从AppCoverLetter、AppError中删除行,哪种方式更好 CREATE DEFINER=`root`@`localhost` PROCEDURE `gdpr_delete`(_email_ varchar(128)) BEGIN DECLARE NumberRecords int; DECLARE RowCou

我创建了一个过程,在这个过程中,我创建了一个临时表来存储列的值,然后我想使用这些列的值来删除其他表中的数据。 如何在while循环中执行此操作,或者简单地使用join从AppCoverLetter、AppError中删除行,哪种方式更好

    CREATE DEFINER=`root`@`localhost` PROCEDURE `gdpr_delete`(_email_ varchar(128))
BEGIN
DECLARE NumberRecords int;
DECLARE RowCount int ;
-- Create a temporary table, note the IDENTITY
-- column that will be used to loop through
-- the rows of this table
CREATE TABLE GdprDeleteData (AppId INT NOT null);

-- Insert the resultset we want to loop through
-- into the temporary table

INSERT INTO  GdprDeleteData (AppId) SELECT AppId FROM ApplyData.AppFormData where lower(Email) = lower(_email_);
-- Get the number of records in the temporary table
SET NumberRecords = ROW_COUNT();
SET RowCount = 1;
select NumberRecords, RowCount;
-- loop through all records in the temporary table
-- using the WHILE loop construct
start transaction;
    DELETE AppCoverLetter  FROM AppCoverLetter inner JOIN GdprDeleteData ON AppCoverLetter.AppID = GdprDeleteData.AppId;
    DELETE AppError        FROM AppError inner JOIN GdprDeleteData ON AppError.AppID = GdprDeleteData.AppId;
    DELETE AppFormData     FROM AppFormData inner JOIN GdprDeleteData ON AppFormData.AppID = GdprDeleteData.AppId;
    DELETE AppJobData      FROM AppJobData inner JOIN GdprDeleteData ON AppJobData.AppID = GdprDeleteData.AppId;
    DELETE AppTrackingData FROM AppTrackingData inner JOIN GdprDeleteData ON AppTrackingData.AppID = GdprDeleteData.AppId;
    DELETE FlowLog         FROM FlowLog inner JOIN GdprDeleteData ON FlowLog.AppID = GdprDeleteData.AppId;
    DELETE App             FROM App inner JOIN GdprDeleteData ON App.AppID = GdprDeleteData.AppId;
    DELETE AppCoverLetter  FROM AppCoverLetter inner JOIN GdprDeleteData ON AppCoverLetter.AppID = GdprDeleteData.AppId;
    DELETE AppResume       FROM AppResume inner JOIN GdprDeleteData ON AppResume.AppID = GdprDeleteData.AppId;

  commit;
-- drop the temporary table

drop table  GdprDeleteData;
END

您可以避免使用临时表和循环 在mysql中,您可以在一次查询中删除两个表中的数据,并对临时数据使用sunquery

   DELETE t1, t2
   FROM AppCoverLetter t1
   INNER JOIN (
     SELECT AppId 
     FROM ApplyData.AppFormData 
     where lower(Email) = lower(_email_)
   ) t3 ON t1.AppID = t3.AppId
   INNER JOIN AppError t2 ON t2.AppID = t3.AppId;
或者如果你有更多的桌子

   DELETE t1, t2, tx
   FROM AppCoverLetter t1
   INNER JOIN (
     SELECT AppId 
     FROM ApplyData.AppFormData 
     where lower(Email) = lower(_email_)
   ) t3 ON t1.AppID = t3.AppId
   INNER JOIN AppError t2 ON t2.AppID = t3.AppId
   INNER JOIN table3 tx ON tx.AppID = t3.AppId;

你有什么问题。。你有错误吗??显示错误消息。。错误的结果更新您的问题添加正确的数据样本和预期结果我想知道哪种方法更好使用联接删除当前的方法,或者我应该在循环时执行什么如果我有两个以上的表,请选中问题中的编辑@scaisEdgeanswer updated。。您只需要delete子句中的表reference和相关的joint,它为多个表@scaisEdgeremoved提供语法错误;在第一个连接应答的末尾更新..如果这3个表中有1个没有匹配条件/没有数据@scaisEdge,则不会删除数据