2016-12-05 3 views
1

まず、私はそれが本当に確信しているので、私のnoobish質問申し訳ありません。ループwhile mysql DB

私は、MySQL 5.5.53をUbuntu 14.04で使用しています。

データベースから文字「z」で始まるユーザー名を持つすべてのユーザーを削除しようとしています。しかし、自分の権利を削除し、自分が属するグループから削除する必要もあります。

これらの表の唯一の共通点は、user表の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

これは、基本的に1つあれば何百ものクエリを実行します。それはあなた自身の答えですが、正解ではありません。 – e4c5

2

このためにストアドプロシージャは必要ありません。必要なのはSQLの1行です

DELETE FROM db_user WHERE user_id LIKE 'z%'; 

それはすべてです。ストアドプロシージャが実行していることは、名前がzで始まるテーブル内のすべてのユーザーを繰り返して、それらを1つずつ削除することです。これは、データのサイズに応じて、何百、何千、何百万という繰り返しクエリを意味する可能性があります。

一般的に、結果セットをループしてそれらの結果を使用して別のクエリを実行すると、ループや繰り返しクエリを伴わない別の方法があります。