我有三个表:
`MEMBERS`
with
`NAME` varchar(24) UNIQUE KEY
`LAST_LOGGED_IN` int(11) - It is a timestamp!
`HOMES`
with
`OWNER` varchar(24)
`CARS`
with
`OWNER` varchar(24)
我对这些表使用 InnoDB,现在我的实际问题是:如果 UNIX_TIMESTAMP()-MEMBERS
.LAST_LOGGED_IN
,如何删除所有表中的行>> 864000?
我正在尝试删除不活跃成员的行,这是迄今为止最难的事情。我有大约 40K 行,并且还在增加。我定期使用 DELETE FROM MEMBERS WHERE UNIX_TIMESTAMP()-LAST_LOGGED_IN> 864000
您的任何帮助将非常感激!谢谢!!
最佳答案
如果您已从 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
(注意,这些语句还将从 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
展望 future ,如果您希望保持这些表“同步”,您可以考虑使用 ON CASCADE DELETE 选项定义 FOREIGN KEY 约束。
或者,您可以使用 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`)
关于mysql - 从多个表中删除多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14008229/