mysql - 从多个表中删除多行

标签 mysql sql

我有三个表:

`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

(注意,这些语句还将从 HOMESCARS 表中删除 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)

为了获得最佳性能,您需要在 HOMESCARS 上建立索引,并以 OWNER 为前导列,例如

... ON `HOMES` (`OWNER`)
... ON `CARS` (`OWNER`) 

关于mysql - 从多个表中删除多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14008229/

相关文章:

php - 如何根据另一个条件在下拉列表中显示 SQL 的特定值

mysql - 经典 ASP 在打开 MySQL 时生成 500 错误

mysql - 从最后一个 WHERE 条件获取结果

sql - 什么是准备好的陈述?它们与动态sql有何不同?

mysql - 错误代码: 1052 - Column 'idk' in field list is ambiguous

php - 在一个响应中返回多个响应数据

sql - 如何处理 SQL Server 幽灵 FK 约束?

sql - 检索以下结果集的最佳 SQL 查询是什么

mysql - 创建通知数据库表的最佳实践

mysql - 在 Ruby 中复制 SQL 行