11

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

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

mysql では、影響を受ける行を取得する「強引な」方法は次のように思われます。 1. READ LOCK を取得します。2. UPDATE/DELETE クエリの WHERE 条件で SELECT して、影響を受ける行 ID を取得します。3. 更新/削除。4. ロックを解除します。

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

4

2 に答える 2

14

トリガーを作成できます

トリガーのサポートは、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';

これは、削除された ID の前にカンマを付けた文字列を返します。

于 2012-02-24T08:30:24.497 に答える
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);
于 2012-01-15T22:34:51.367 に答える