1. ホーム
  2. sql

[解決済み] ID が他のテーブルと一致しない sql 行を削除する

2022-04-14 22:09:25

質問

mysqlのテーブルで孤立したエントリーを削除しようとしています。

このようなテーブルが2つあります。

テーブル files :

| id | ....
------------
| 1  | ....
| 2  | ....
| 7  | ....
| 9  | ....

テーブル blob :

| fileid | ....
------------
| 1  | ....
| 2  | ....
| 3  | ....
| 4  | ....
| 4  | ....
| 4  | ....
| 9  | ....

fileidid カラムを使用して、テーブルを結合することができます。

テーブルのすべての行を削除したい blob ここで fileid はテーブルの中に見つからない files.id .

つまり、上記の例では、行を削除することになります。3 & 4(s)の行を削除することになります。 blob テーブルを作成します。

解決方法は?

LEFT JOIN/IS NULLを使用する。

DELETE b FROM BLOB b 
  LEFT JOIN FILES f ON f.id = b.fileid 
      WHERE f.id IS NULL

NOT EXISTSを使用する。

DELETE FROM BLOB 
 WHERE NOT EXISTS(SELECT NULL
                    FROM FILES f
                   WHERE f.id = fileid)

NOT INを使用する。

DELETE FROM BLOB
 WHERE fileid NOT IN (SELECT f.id 
                        FROM FILES f)

注意事項

可能な限り、トランザクション内で DELETE を実行してください (サポートされていると仮定して - IE: MyISAM では未対応)。