MySQL跨多个表删除

Rac*_*elD 2 php mysql pdo

我正在开发一个cron脚本(在PHP PDS中用于MySQL数据库),它将从数据库中删除超过30天的数据.香港专业教育学院尝试加入和删除cascaded在我的表和语句,但他们没有成功,所以我采用更简单的方法来使它工作,但我知道这不是最有效的处理器方法.

请注意,其中一些表(尤其是链接表)有数十万行,这就是为什么我想要比我在这里更聪明一点.

表结构很简单,有一个表键表,有一个时间戳和一个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]");
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法把它变成一个声明?请谢谢你的帮助.

编辑:继承人我最终得到了什么.

/* 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']));
    }
}   
Run Code Online (Sandbox Code Playgroud)

Mik*_*ant 5

您应该可以使用以下一个查询删除:

DELETE kt, lt, dt, t
FROM `$keyTable` AS kt
LEFT OUTER JOIN `$linksTable` AS lt on kt.id = lt.tablekey_id
LEFT OUTER JOIN `$domainsTable` AS dt on kt.id = dt.tablekey_id
LEFT OUTER JOIN `$terms` AS t on  kt.id = t.tablekey_id
WHERE kt.id = $row[id]
Run Code Online (Sandbox Code Playgroud)

请注意,我在这里使用了外连接,因为我不确定是否keyTable保证除了那些之外的表tablekey_id.如果是,则可以使用内部联接.