テーブルからすでに行を削除しており、列の値がテーブル内のどの行の値とも一致しないMEMBERS
他の 2 つのテーブルから行を削除する場合は、次のようにします。OWNER
NAME
MEMBERS
DELETE h.*
FROM `HOMES` h
LEFT
JOIN `MEMBERS` m
ON m.`NAME` = h.`OWNER`
WHERE m.`NAME` IS NULL
DELETE c.*
FROM `CARS` c
LEFT
JOIN `MEMBERS` m
ON m.`NAME` = c.`OWNER`
WHERE m.`NAME` IS NULL
(注: これらのステートメントはHOMES
、CARS
テーブルから行を削除し、OWNER
列を NULL 値として削除します。)
DELETE を実行する前に、SELECT を使用してこれらのステートメントのテストを実行することを強くお勧めします。(キーワード DELETE をキーワード SELECT に置き換えます。
-- DELETE h.*
SELECT h.*
FROM `HOMES` h
LEFT
JOIN `MEMBERS` m
ON m.`NAME` = h.`OWNER`
WHERE m.`NAME` IS NULL
今後、これらのテーブルを「同期」させたい場合は、ON CASCADE DELETE オプションを使用して FOREIGN KEY 制約を定義することを検討してください。
または、3 つのテーブルすべてから行を削除する DELETE ステートメントを使用できます。
DELETE m.*, h.*, c.*
FROM `MEMBERS` m
LEFT
JOIN `HOMES` h
ON h.`OWNER` = m.`NAME`
LEFT
JOIN `CARS` c
ON c.`OWNER` = m.`NAME`
WHERE UNIX_TIMESTAMP()-m.`LAST_LOGGED_IN` > 864000
(注意: そこの述語は、列のインデックスを使用できませんLAST_LOGGED_IN
。「裸の」列への参照を持つ同等の述語は、インデックスを使用できます。
WHERE m.`LAST_LOGGED_IN` < UNIX_TIMESTAMP()-864000
または同等のもの:
WHERE m.`LAST_LOGGED_IN` < UNIX_TIMESTAMP(NOW() - INTERVAL 10 DAY)
HOMES
最高のパフォーマンスを得るには、両方にインデックスが必要CARS
であり、先頭の列は ですOWNER
。
... ON `HOMES` (`OWNER`)
... ON `CARS` (`OWNER`)