如果您已經從MEMBERS
表中刪除行,你想從其他兩個表中刪除的行,其中OWNER
列的值不會在MEMBERS
表中任何行匹配NAME
值:
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
(NB這些語句也將從HOMES
和CARS
表中刪除行OWNER
列作爲NULL值。)
我強烈建議你運行一個TE在運行DELETE之前,使用SELECT使用這些語句的st。 (替換關鍵字用關鍵字選擇刪除,即
-- DELETE h.*
SELECT h.*
FROM `HOMES` h
LEFT
JOIN `MEMBERS` m
ON m.`NAME` = h.`OWNER`
WHERE m.`NAME` IS NULL
展望未來,如果你想「同步」,以保持這些表,你可以考慮定義外鍵約束與ON CASCADE DELETE選項。
或者,您可以使用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
(NB謂詞出現無法使上使用索引3210欄。引用「裸」列的等價謂詞將能夠使用索引。
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`)
好的第一個問題。 – slm