我有三张桌子:
`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清洗它
你的任何帮助都是非常感激的!谢谢!!
发布于 2012-12-23 04:08:55
如果您已经从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列)中删除行,作为空值。)
我强烈建议您在运行DELETE之前使用SELECT对这些语句进行测试。(用关键字选择替换关键字DELETE,即
-- DELETE h.*
SELECT h.*
FROM `HOMES` h
LEFT
JOIN `MEMBERS` m
ON m.`NAME` = h.`OWNER`
WHERE m.`NAME` IS NULL接下来,如果希望保持这些表“同步”,可以考虑使用ON级联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(注:那里的谓词不能使用LAST_LOGGED_IN列上的索引。引用"bare“列的等价谓词将能够使用索引。
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`) https://stackoverflow.com/questions/14008229
复制相似问题