我正在从数据库中删除超过30天的数据的cron脚本(在PHP PDS中为MySQL数据库)。我试图加入和删除级联我的表和声明,但他们没有解决,所以我在这里采取了一个更简单的方法来让它工作,但我知道这不是最有效的处理器方法。跨多个表的MySQL删除
请注意,这些表中的一些(特别是链接表)有成千上万的行,所以这就是为什么我想比我在这里更聪明一些。
表结构很简单,有一个表的关键表,有一个时间戳和一个ID。在所有表格中重复该id为tablekey_id
。
我目前的cron作业如下。
/* Cron script to delete old data from the database. */
if (@include dirname(dirname(dirname(__FILE__))) . '/dbconn/website_connections.php') {
$conn = $connectionFromOtherFile;
$keyTable = 'table_key';
$linksTable = 'links';
$domainsTable = 'link_domains';
$terms = 'searched_domains';
$query = $conn->query("SELECT `id` FROM `$keyTable` WHERE `timestamp` < (NOW() - INTERVAL 30 DAY)");
$query->setFetchMode(PDO::FETCH_ASSOC);
while($row = $query->fetch()) {
$conn->exec("DELETE FROM `$linksTable` WHERE `tablekey_id` = $row[id]");
$conn->exec("DELETE FROM `$domainsTable` WHERE `tablekey_id` = $row[id]");
$conn->exec("DELETE FROM `$terms` WHERE `tablekey_id` = $row[id]");
$conn->exec("DELETE FROM `$keyTable` WHERE `id` = $row[id]");
}
}
有没有什么办法可以把它变成一个声明?请谢谢你的帮助。
编辑:继承人我结束了。
/* Cron script to delete old data from the database. */
if (@include dirname(dirname(dirname(__FILE__))) . '/dbconn/website_connections.php') {
$conn = $connectionFromOtherFile;
$keyTable = 'table_key';
$linksTable = 'links';
$domainsTable = 'link_domains';
$terms = 'searched_domains';
$delete = $conn->prepare("DELETE tablekey, linktable, domaintable, searched
FROM `$keyTable` AS tablekey
LEFT OUTER JOIN `$linksTable` AS linktable on tablekey.id = linktable.tablekey_id
LEFT OUTER JOIN `$domainsTable` AS domaintable on tablekey.id = domaintable.tablekey_id
LEFT OUTER JOIN `$terms` AS searched on tablekey.id = searched.tablekey_id
WHERE tablekey.id = :tablekey_id");
$query = $conn->query("SELECT `id` FROM `$keyTable` WHERE `timestamp` < (NOW() - INTERVAL 30 DAY)");
$query->setFetchMode(PDO::FETCH_ASSOC);
while($row = $query->fetch()) {
$delete->execute(array('tablekey_id' => $row['id']));
}
}
你有考虑外键和级联删除吗? – 2013-02-21 16:22:42
为什么使用PDO构建查询字符串?它支持预处理语句,它在循环中具有性能优势,并且不易受SQL注入的影响 – GordonM 2013-02-21 16:22:57
可能重复[Mysql - 使用一个查询从多个表中删除](http://stackoverflow.com/questions/4839905/mysql-delete -from-multiple-tables-with-one-query) – 2013-02-21 16:23:09