2011-10-21 191 views
0

为什么下面的查询不起作用?在SQL中删除以下五个表格行的最佳方法是什么?我该如何解决它?带删除的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 =>此已经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 RELA:

table_1.id一个行有65也是table_2table_4rela 65table_1.id = table_2.rela => 65 = 65, table_1.id = table_4.rela => 65 = 65)现在在table_2我们有一个列名h_id,其编号为11,在其他表中设置为h_id [table_3table_5]。

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

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

table_1.id = 65 =>table_4.rela = 65 =>table_2.rela = 65 ->table_2.h_id = 11 =>table_3.h_id = 11 =>table_5.h_id = 11 .

UPDATE 3:

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

+4

你到底在想什么? –

+0

您总是首先打开错误信息。错误信息是什么? –

+0

谁能帮我解决我的问题,有一个人?对于问题,我还没有得到答案。 – JimBo

回答

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 

希望这有助于

+0

你可以同时从几个表中删除,如下所示:http://dev.mysql.com/doc/refman/5.0/en/delete.html – Draiken

+0

请给我一个例子,从我的SQL。谢谢 – JimBo

+0

你的SQL只是不是SQL。 –

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 
+0

不起作用。它有错误:http://pastebin.com/Lnnst8AM – JimBo

+0

不,错了,我想删除表中的行。怎么样? – JimBo

+0

按照文档的建议尝试使用内部连接。我修改了我的答案。 –

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 
} 
+0

在其他表中没有行ID,其中一些是'h_id '而另一些是'rela',它们在表格行中的值是不同的。请在第一篇文章中看到我的更新。 – JimBo

+0

您是否检查过是否已有任何FK限制? –

+0

我不明白你的意思是“已经存在任何FK限制”? – JimBo