带有JOIN的SQL DELETE

时间:2011-10-21 16:44:25

标签: php mysql codeigniter join

为什么以下查询不起作用?在SQL中删除以下五个表行的最佳方法是什么?我该如何解决?

//$id = $this->input->post('id');
$id = '65';
    $this->db->query("
        DELETE table_1, table_2, table_3, table_4, table_5
        FROM table_1
            JOIN  table_2   ON table_1.id = table_2.rela
            JOIN  table_3   ON table_2.h_id = table_3.h_id          
            JOIN  table_4   ON table_1.id = table_4.rela
            JOIN  table_5   ON table_2.h_id = table_5.h_id
        WHERE table_1.id =".floor($id));

更新

table_1.id =>这个ID为65
table_2.rela =>这有相对65
table_2.h_id =>这有h_id 11
table_3.h_id =>这有h_id 11
table_4.rela =>这有相对65
table_5.h_id =>这有h_id 11

更新2:

<{1>} table_1.id中的一行有65table_2table_4现在rela 65table_1.id = table_2.rela => 65 = 65, table_1.id = table_4.rela => 65 = 65table_2 1}}我们的列名为h_id,其编号为11,并在其他表[h_idtable_3]中设置为table_5

这种关系如何从id获得table_1并删除其表中的其他行。

我的鬃毛是这样的:(来自id有一个table_1我们可以在他们的表中删除与它的其他行关系,下面是这个关系中的一个例子)

  

table_1.id = 65 =&gt; table_4.rela = 65 =&gt; table_2.rela = 65    - &gt; table_2.h_id = 11 =&gt; table_3.h_id = 11 =&gt; table_5.h_id = 11

更新3:

谁能帮助我解决我的问题,有一个人?我没有得到问题的答案。

3 个答案:

答案 0 :(得分:1)

您必须逐个删除表格的行。

还可以为级联删除定义表...如果这样做,您只需要在一个表中只删除一行。其他表中的其他相关行将自动删除。

        CREATE TABLE `tableName` (
        `id` int(10) unsigned NOT NULL auto_increment,
        `typeId` int(10) unsigned NOT NULL,
        PRIMARY KEY (`id`),
        KEY `type` (`typeId`)
        CONSTRAINT `myForeignKey` FOREIGN KEY (`typeId`)
          REFERENCES `types` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

希望这会有所帮助

答案 1 :(得分:0)

您说要删除表,但您可能意味着要删除表中的行。删除或删除表意味着删除表及其所有内容。

我看到一个问题。你在第一部分中提到了table_1,但没有再提到。我假设第一个表是table_1而不是tour_foreign。

    DELETE table_1, table_2, table_3, table_4, table_5
    FROM table_1
        INNER JOIN  table_2   ON table_1.id = table_2.rela
        INNER JOIN  table_3   ON table_2.h_id = table_3.h_id          
        INNER JOIN  table_4   ON table_1.id = table_4.rela
        INNER JOIN  table_5   ON table_2.h_id = table_5.h_id
    WHERE table_1.id = 5

从mysql文档看,如果要删除所有这些表中的行,您似乎也可以省略表格列表:

    DELETE FROM table_1
        INNER JOIN  table_2   ON table_1.id = table_2.rela
        INNER JOIN  table_3   ON table_2.h_id = table_3.h_id          
        INNER JOIN  table_4   ON table_1.id = table_4.rela
        INNER JOIN  table_5   ON table_2.h_id = table_5.h_id
    WHERE table_1.id = 5

答案 2 :(得分:0)

不确定为什么要尝试在应用层执行此操作。 MySQL提供了使用外键约束删除子行的功能(ON DELETE CASCADE)。检查您当前的架构并查看它们是否已可用:

mysql> show create table child_table;

如果有可用的外键约束,您应该看到类似的内容:

CONSTRAINT `constraint_id` FOREIGN KEY (`some_id`) REFERENCES `some_table` (`id`) ON DELETE CASCADE

这意味着如果你从'some_table'中删除一行,'child_table'中引用与'some_table'相同的id的任何行都将被自动删除。

http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html了解更多信息。

如果您需要在应用层执行此操作,那么您应该考虑一个事务,我假设您正在使用PDO,尽管它可以与mysqli一起使用。以下是一个潜在的解决方案,因此我对您可能遭受的任何数据丢失不承担任何责任。

$this->db->beginTransaction();

try {

   $this->db->execute('DELETE FROM table_1 WHERE id = 65');
   $this->db->execute('DELETE FROM table_2 WHERE rela = 65');
   $this->db->execute('DELETE FROM table_3 WHERE h_id = 11');
   $this->db->execute('DELETE FROM table_4 WHERE rela = 65');
   $this->db->execute('DELETE FROM table_5 WHERE h_id = 11');

   $this->db->commit();

} catch (Exception $e) {

    error_log($e->getMessage());

    $this->db->rollBack();

    $e = null; // PHP is notorious for not cleaning exceptions very well so force it
}