在mysql DB上循环

时间:2016-12-05 10:56:59

标签: mysql

首先,对不起我的犹豫不决的问题,因为我很确定。

我在Ubuntu 14.04上使用MySQL 5.5.53。

我尝试删除所有使用用户名开头的用户#34; z"来自数据库。但我也需要删除他们的权利,并将他们从他们所属的群体中删除。

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

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

不幸的是,这不起作用:

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

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;
                @count = @count -1;
        END WHILE;
END;

然后我这样做:

  

mysql -u root -p mysqldb< clearusers.sql

然后我收到此错误:

  

第1行的错误1064(42000):您的SQL语法出错;查看与您的MySQL服务器版本相对应的手册,以获得在''附近使用的正确语法。在第3行

我不知道自己做错了什么。所以对任何人:先谢谢你的帮助。

PROC。

2 个答案:

答案 0 :(得分:2)

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

DELETE FROM db_user WHERE user_id LIKE 'z%';

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

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

答案 1 :(得分: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 ;

感谢您的帮助。