为什么以下查询不起作用?在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
中的一行有65
,table_2
和table_4
现在rela 65
(table_1.id = table_2.rela => 65 = 65, table_1.id = table_4.rela => 65 = 65
)table_2
1}}我们的列名为h_id,其编号为11
,并在其他表[h_id
,table_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:
谁能帮助我解决我的问题,有一个人?我没有得到问题的答案。
答案 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
}