2016-12-05 59 views
1

首先,对于我的noobish问题抱歉,因为我很确定它是。虽然循环在mysql数据库

我在Ubuntu 14.04上使用MySQL 5.5.53。

我试图从数据库中以字母“z”开头的用户名来删除所有用户。但我也需要删除他们的权利,并将他们从他们所属的组中删除。

这些表格之间唯一的共同点是用户表中的user_id。

下面,这是我试图用来删除用户的方法。一旦它适用于它,它就会像其他表格的abc一样简单。

不幸的是,这并不工作:

我创建了一个文件 “clearusers.sql”:

​​

那么我这样做:

mysql -u root -p mysqldb < clearusers.sql

然后我得到这个错误:

ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3

我不知道我在做什么错。所以对任何人:感谢您的帮助。

Proc。

+0

编辑问题!对不起,不够清楚。 – Processor

回答

0

所以我发现自己做什么用我的脚本去错在这里是错误的和固定的版本:

什么是错误的评论:

--Missing delimiter change 
    CREATE PROCEDURE clearusers() 
    BEGIN 
      SELECT @count := COUNT(*) FROM db_user WHERE username like 'z%'; 
      WHILE @count > 0 DO 
        SELECT @user_id := user_id FROM db_user WHERE username LIKE 'z%' LIMIT 1; 
--Star not needed for the delete 
        delete * from db_user where user_id = @user_id; 
--Select missing before @count 
        @count = @count -1; 
      END WHILE; 
    END; 
--missing back to original delimiter. 
--missing call procedure. 

好:

DELIMITER çç 
CREATE PROCEDURE clearusers() 
BEGIN 
     SELECT @count := COUNT(*) FROM db_user WHERE username like 'z%'; 
     WHILE @count > 0 DO 
       SELECT @user_id := user_id FROM db_user WHERE username LIKE 'z%' LIMIT 1; 
       DELETE FROM db_user where user_id = @user_id; 
       SELECT @count := @count -1; 
     END WHILE; 
END; 
çç 

DELIMITER ; 

感谢你的帮助。

+0

这基本上是在数量足够的时候进行数百次查询。即使这是你自己的答案,这不是正确的答案。 – e4c5

2

您不需要为此存储过程。你需要的是一行sql

DELETE FROM db_user WHERE user_id LIKE 'z%'; 

就是这样。您的存储过程正在执行的操作是遍历表中名称以z开头并将其逐个删除的所有用户。这可能意味着成千上万甚至数百万次的重复查询,这取决于数据的大小。

通常,作为一个经验法则,当您发现自己循环遍历结果集并对这些结果执行另一个查询时,还有另一种不涉及循环和重复查询的方法。