2012-01-15 17 views
9

mysqlのUPDATEまたはDELETEクエリから影響を受ける行IDのリスト(PHPのmysql_affected_rows()によって影響を受ける行数ではなく、影響を受けた実際の行ID)を取得する効率的な方法はありますか?mysqlでUPDATE/DELETEを実行し、影響を受ける行IDのリストを取得しますか?

postgresqlには、返される影響を受ける行の値を指定するために使用できるUPDATE/DELETEクエリ内にRETURNING句があります。

mysqlでは、影響を受ける行を取得するための「ブルートフォース」方法は、次のようになります。 1. READ LOCKを取得します。 2. UPDATE/DELETEクエリのWHERE条件を指定して、影響を受ける行IDを取得します。 3. UPDATE/DELETE。 4.リリースロック。

上記の方法は非常に非効率的です。 mysqlの影響を受ける行IDを取得するより効率的な方法はありますか?

+0

にコンマが前のIDそれぞれが私の答えの仕事をしましたか? – redmoon7777

答えて

9

はこれをしようと、それはのように更新idを返します "1,2,3 ......":

SET @uids := ''; 
UPDATE table_name 
    SET some_col= 'some_val' 
WHERE some_col= 'some_val' 
    AND (SELECT @uids := CONCAT_WS(',', @uids, id)); 
SELECT TRIM(LEADING ',' FROM @uids); 
+0

別のケースであるため、新しい質問をする必要があります。また、使用したクエリと報告されたエラーも含める必要があります。 (あなたがそうするなら、新しい質問へのリンクを私に提供して喜んで助けてくれるでしょう) – redmoon7777

+0

私はそれを解決しました。私のコメントと例を入力していましたが、編集者は私に新しい行を許しませんでした。 。 – Dan

13

あなたはトリガのTrigger

サポートを作成することができます始め含まれていますMySQL 5.0.2。トリガー は、テーブルに関連付けられている名前付きデータベースオブジェクトであり、テーブルの特定のイベントが発生すると がアクティブになります。

次のコードは、フィールドを持つmytableという名前のテーブルにトリガーを作成しid

CREATE TRIGGER mytable_delete 
AFTER DELETE ON mytable 
FOR EACH ROW SET @deletedIDs = CONCAT_WS(',', @deletedIDs, OLD.id) 

予告OLDは、あなたがすることができますテーブルの上にトリガを作成した後、削除された行

を参照していること次のように使用してください。

/* empty parameter defined in CREATE TRIGGER */ 
Set @deletedIDs = ''; 
/* perform your query */ 
DELETE FROM mytable WHERE myotherfield = 'myfilterevalue'; 
/* get the parameter */ 
SELECT @deletedIDs AS 'Deleted_IDs'; 

このw病気のリターンが削除文字列

+0

このトリガーを使用することをお勧めします。 'AFTERこれは主要コンマを除去 ' (リーディング '' CONCAT_WS FROM( ''、@deletedIDs、OLD.id))をTRIM =各行のSET @deletedIDs FOR MYTABLE のDeleteトリガmytable_delete を作成します。 – Sirio

関連する問題