Php SQL删除与联接
为什么下面的查询不起作用?在SQL中删除以下五个表行的最佳方法是什么?我怎样才能修好它Php SQL删除与联接,php,mysql,codeigniter,join,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 = t
//$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));
更新:
表_1.id=>这有id65
表2.rela=>这有rela
65
表2.h\u id=>这有h\u id
11
表3.h\u id=>这有h\u id
11
表4.rela=>这有rela
65
表5.h\u id=>这有h\u id
11
更新2: 在
table_1.id
中,一行包含65
,也用于table_2
和table_4
中包含rela 65
(table_1.id=table_2.rela=>65,table_1.id=table_4.rela=>65
)现在在table_2
中,我们有一个列名h_id,其编号为11
,在其他表[table_3
,table_5
]中,它被设置为h_id
该关系如何从表1
中获取id
,并删除其表中的其他行
主要是这样的:(使用表1
中的have oneid
,我们可以删除表中与其相关的其他行,下面是该关系的一个示例)
表1.id
=65
=>表4.rela
=65
=>表2.rela
=65
->表2.h\u id
=11
=>表3.h\u id
=11
=表5.h\u id
=11
更新3:
谁能帮我解决问题,有个人吗?我无法得到问题的静态答案。您必须逐个删除表中的行 也可以为级联删除定义表。。。如果执行此操作,则只需删除一个表中的一行。其他表中的其他相关行将自动删除
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,但没有再次提及。我假设第一个表是表1,而不是tour
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
不知道你为什么要在应用层这样做。MySQL提供了使用外键约束(在delete级联上)删除子行的能力。检查当前架构并查看它们是否已可用:
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的任何行都将自动删除
更多信息
如果你需要在APP层做这件事,那么你应该真正考虑一个事务,我假设你在使用PDO,尽管它可能与MySQL相关。下面是一个潜在的解决方案,因此我不承担任何您可能招致的数据丢失的责任
$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
}
你到底想干什么?你总是从错误信息开始。错误信息是什么?谁能帮我解决问题,有个人吗?我还没有得到问题的答案。你可以同时从几个表中删除,如这里所述:@dknaack-我不明白你的sql,它是如何在五个表中删除的(表1、表2、表3、表4、表5)?搞错了,我想删除表中的行。怎么样?@dknaack:对不起,那不是给你的。未标记作者。在其他表中没有行id,其中一些是
h_id
,另一些是rela
,它们在表行中的值不同。请在第一篇文章中查看我的更新。您是否检查过是否已经存在任何现有FK约束?我不理解您的意思“已经存在任何FK约束”?请出错,我要删除表中的行。怎么回事?FK=外键。FK约束告诉mysql一个表中的列与另一个表中的列相关。这允许您维护引用完整性并实现级联删除。你应该仔细阅读这个主题。不,犯一个错误,我想删除表中的行。怎么样?按照文档建议尝试使用内部连接。我修改了我的答案。请阅读我在第一篇文章中的更新2,并告诉我我的问题,我该怎么做?它有以下错误:您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以了解第2行“表_1.id=table_2”附近使用的正确语法