2016-12-05 69 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開頭並將其逐個刪除的所有用戶。這可能意味着成千上萬甚至數百萬次的重複查詢,這取決於數據的大小。

通常,作爲一個經驗法則,當您發現自己循環遍歷結果集並對這些結果執行另一個查詢時,還有另一種不涉及循環和重複查詢的方法。