MySQL で Join を使用して削除
このチュートリアル記事では、MySQL の JOIN
メソッドを使用して複数のテーブルのデータを削除する方法を説明します。これは、あるテーブルの特定のレコードに関連する別のテーブルのレコードを同時に削除する場合に便利です。
MySQL で DELETE FROM
ステートメントを使用する際の制限
DELETE FROM
ステートメントは、テーブルの行を削除するために使用されます。WHERE
を適用して、削除時に満たす行と条件を指定できます。
次のコードには 2つのテーブルが含まれています。1つ目はサプライヤーの商品とその場所を記録し、2つ目はこれらの商品を販売する店の所有者のリストです。
Create Table supplier (
suppId INTEGER PRIMARY KEY,
category TEXT NOT NULL,
location TEXT NOT NULL
);
Create Table shops (
owner TEXT NOT NULL,
shptype TEXT NOT NULL,
area TEXT NOT NULL
);
INSERT INTO supplier VALUES (0001, 'Veggies', 'Downtown');
INSERT INTO supplier VALUES (0002, 'Fruits', 'Downtown');
INSERT INTO supplier VALUES (0003, 'Dairy', 'Downtown');
INSERT INTO supplier VALUES (0004, 'Veggies', 'Uptown');
INSERT INTO supplier VALUES (0005, 'Fruits', 'Uptown');
INSERT INTO supplier VALUES (0006, 'Dairy', 'Uptown');
INSERT INTO shops VALUES ('Mark', 'Veggies', 'Downtown');
INSERT INTO shops VALUES ('Mark', 'Fruits', 'Downtown');
INSERT INTO shops VALUES ('Susan', 'Dairy', 'Downtown');
テーブル内のすべてのショップはダウンタウンに拠点を置いているため、この場合、アップタウン
エリアのサプライヤーの記録を維持する意味はありません。
DELETE
の使用は、一度に 1つのテーブルに対してのみ機能します。shops
テーブルからデータを取得し、基準を指定して、すべての条件に一致する supplier
テーブルのすべてのレコードを削除できます。
この場合、JOIN
を使用して supplier
テーブルから Uptown
のすべてのレコードを削除します。
MySQL で INNER JOIN
メソッドを使用する
INNER JOIN
メソッドを使用すると、2つ以上のテーブルをマージし、一度に複数の行を削除できます。
サブクエリを使用するなどの代替オプションがありますが、これはジョブを実行するためのより実用的な方法です。上記のテーブルの例を使用すると、Uptown
値を持つ両方のテーブルのすべての行を削除できます。
次のコードは、ショップの場所を検索し、Downtown
として登録されているサプライヤーを削除しながら、サプライヤーを Uptown
エリアに保持します。
DELETE supplier FROM supplier
INNER JOIN shops ON supplier.category = shops.shptype
WHERE supplier.location != shops.location;
テーブルの結合は、同様のデータを共有するフィールドに基づいていました。カテゴリフィールドには、この場合、サプライヤが提供したものと販売したショップが表示されました。
2つのテーブルをマージすると、削除の条件を 1つだけ定義できます。この場合、サプライヤの場所によって、削除する行が決まります。
DELETE
の後にテーブルの名前を追加するだけで、両方のテーブルを同時に削除することもできます。これは、複数のテーブルに複数のレコードがある場合に機能します。
DELETE supplier, shops FROM supplier
...
MySQL で JOIN
を使って削除する場合の最終的な結果
その結果、テーブルはそのまま残り、同時に上記の基準を満たさないサプライヤのすべてのレコードが削除されます。
Create Table supplier (
suppId INTEGER PRIMARY KEY,
category TEXT NOT NULL,
location TEXT NOT NULL
);
Create Table shops (
owner TEXT NOT NULL,
shptype TEXT NOT NULL,
location TEXT NOT NULL
);
INSERT INTO supplier VALUES (0001, 'Veggies', 'Downtown');
INSERT INTO supplier VALUES (0002, 'Fruits', 'Downtown');
INSERT INTO supplier VALUES (0003, 'Dairy', 'Downtown');
INSERT INTO supplier VALUES (0004, 'Veggies', 'Uptown');
INSERT INTO supplier VALUES (0005, 'Fruits', 'Uptown');
INSERT INTO supplier VALUES (0006, 'Dairy', 'Uptown');
INSERT INTO shops VALUES ('Mark', 'Veggies', 'Downtown');
INSERT INTO shops VALUES ('Mark', 'Fruits', 'Downtown');
INSERT INTO shops VALUES ('Susan', 'Dairy', 'Downtown');
-- delete function
DELETE supplier FROM supplier
INNER JOIN shops ON supplier.category = shops.shptype
WHERE supplier.location != shops.location;
上記は、場所(この場合は Downtown
)によってすべてのサプライヤーをショップに一致させ、基準に一致しないすべての行をサプライヤーテーブルから削除します。
次の SELECT
トライアルから、supplier
テーブルには Downtown
としてリストされているサプライヤーのみが含まれていることがわかります。
SELECT * FROM supplier
結果: