在 MySQL 中使用 Join 刪除
本教程文章將向你展示如何使用 MySQL JOIN 方法刪除多個表中的資料。當你同時刪除一個表中與另一個表中的特定記錄相關的記錄時,這很有用。
在 MySQL 中使用 DELETE FROM 語句的限制
DELETE FROM 語句用於刪除表中的行。你可以應用 WHERE 來指定刪除時要滿足的行和條件。
以下程式碼包含兩個表,第一個記錄供應商商品及其位置,第二個記錄銷售這些商品的店主列表:
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');
表中的所有商店都位於市中心,因此在這種情況下,維護 Uptown 地區的供應商記錄是沒有意義的。
使用 DELETE 一次只能用於一張表。你可以從 shops 表中獲取資料,指定條件,然後刪除 supplier 表中與所有條件匹配的所有記錄。
在這種情況下,我們將使用 JOIN 從 supplier 表中刪除 Uptown 的所有記錄。
在 MySQL 中使用 INNER JOIN 方法
使用 INNER JOIN 方法將允許你合併兩個或多個表並一次刪除多行。
還有其他選擇,例如使用子查詢,但這是完成工作的更實用的方法。使用上面的示例表,你可以刪除兩個表中具有 Uptown 值的所有行。
以下程式碼將查詢商店的位置並將供應商保留在 Downtown 區域,同時刪除註冊為 Uptown 的供應商:
DELETE supplier FROM supplier
INNER JOIN shops ON supplier.category = shops.shptype
WHERE supplier.location != shops.location;
表的連線基於共享相似資料的欄位。類別欄位顯示了在這種情況下供應商提供了什麼以及銷售了哪些商店。
合併這兩個表將允許你只定義一個刪除條件。在這種情況下,供應商的位置將決定要刪除的行。
你也可以通過在 DELETE 後新增表名來同時刪除兩個表。如果你在多個表中有多個記錄,這將起作用。
DELETE supplier, shops FROM supplier
...
使用 JOIN 刪除 MySQL 的最終結果
結果將使你的表格保持完整,同時刪除不符合上述標準的供應商的所有記錄。
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
結果:
