1. ホーム
  2. mysql

[解決済み] MySQLにおけるOracleのRowIDに相当する。

2022-02-05 05:39:45

質問

oracle の rowid に相当するものが mysql にありますか?

delete from my_table where rowid not in (select max(rowid) from my_table group by field1,field2)

このクエリと同等のものをmysqlで作りたい!!!!

my_tableには主キーがありません。重複する値を削除して、主キー(field1, field2の合成)を設定しようとしています。

どのように解決するのですか?

MySql では、機能を実現するために通常セッション変数を使用します。

SELECT @rowid:=@rowid+1 as rowid
FROM table1, (SELECT @rowid:=0) as init
ORDER BY sorter_field

しかし、サブクエリで削除しようとするテーブルのソートを作ることはできません。

アップデイト つまり、一時テーブルを作成し、一時テーブルに範囲指定サブクエリを挿入し、一時テーブルと結合して元のテーブルから削除する必要があります(何らかの一意の行識別子が必要です)。

CREATE TEMPORARY TABLE duplicates ...

INSERT INTO duplicates (rowid, field1, field2, some_row_uid)
SELECT
  @rowid:=IF(@f1=field1 AND @f2=field2, @rowid+1, 0) as rowid,
  @f1:=field1 as field1,
  @f2:=field2 as field2,
  some_row_uid
FROM testruns t, (SELECT @rowid:=NULL, @f1:=NULL, @f2:=NULL) as init
ORDER BY field1, field2 DESC;

DELETE FROM my_table USING my_table JOIN duplicates
  ON my_table.some_row_uid = duplicates.some_row_uid AND duplicates.rowid > 0

これは一回だけの操作なので、あまりオーバーヘッドをもたらさないはずです。