如何在其他表中删除所有子行的父行?

5
父表
----------------------------------------------------------------------
id         名称
1           a
2           b
子表 --------------------------------------------------------------------- id 父表id 名称 1 1 c 2 1 d 3 1 e 4 2 f 5 2 g

如果我从父表中删除第一行,那么怎样才能删除所有与其相关的子行?


如果删除父行,您是否想要删除子行? - Murad Hasan
1
使用外键概念来实现:http://dev.mysql.com/doc/refman/5.7/en/innodb-foreign-key-constraints.html - Brijal Savaliya
你用的引擎是什么?让我们来展示一下表结构。如果是INODB,那就没问题了。否则你需要使用join或者2个查询语句来实现。 - Dipanwita Kundu
是的,我想删除其父行的所有子项。 - Salman Quader
6个回答

5
除了级联删除之外,您还可以使用连接(join),请参见以下示例:
DELETE parent_table, child_table 
FROM parent_table INNER JOIN child_table
  ON parent_table.id = child_table.parent_table_id
WHERE parent_table.id = 1

3

在添加外键约束时,请使用以下选项:

ON DELETE  'CASCADE' 
ON UPDATE  'RESTRICT'

现在,如果您删除一个父行,所有相关的子行也将被删除。

2

使用外键

CREATE TABLE parent (
  id INT NOT NULL,
  PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child (
  id INT,
  parent_id INT,
  INDEX par_ind (parent_id),
  FOREIGN KEY (parent_id)
  REFERENCES parent(id)
  ON DELETE CASCADE
) ENGINE=INNODB;


INSERT INTO parent VALUES (1), (2);
INSERT INTO child VALUES (1, 1);

# This query implicitly removes from `child` where parent_id = 1
DELETE FROM parent WHERE id = 1;

2

使用级联删除定义外键。当您删除父行时,子行也会被删除。 此教程将指导您完成操作。

提示:在创建子表时需要添加ON DELETE CASCADE

针对您的情况:

CREATE TABLE parent_table(
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(255) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB;

CREATE TABLE child_table (
  id int(11) NOT NULL AUTO_INCREMENT,
  parent_table_id int(11) NOT NULL,
  name varchar(255) NOT NULL,
  PRIMARY KEY (id),
  KEY parent_table_id (parent_table_id),
  CONSTRAINT id_ibfk_1 
  FOREIGN KEY (parent_table_id) 
  REFERENCES parent_table (parent_table_id) 
  ON DELETE CASCADE
) ENGINE=InnoDB;

现在,您的删除查询语句:
DELETE FROM parent_table
WHERE id= 2

您的结果数据将是:
parent_table
----------------------------------------------------------------------
id         name
1           a

child_table
---------------------------------------------------------------------
id        parent_table_id            name
1               1                      c
2               1                      d
3               1                      e

根据评论的要求:

您可以从mysql文档中查看解释。

  • Key - 索引的同义词
  • Constraint - 外键约束
  • References - 外键约束的一部分,它导致MySQL要求参考表中指定列的值也存在于被引用表的指定列中。

更新现有表:

ALTER TABLE child_table 
      ADD CONSTRAINT id_ibfk_1 
      FOREIGN KEY (parent_table_id) 
      REFERENCES parent_table (parent_table_id) 
      ON DELETE CASCADE

请解释这些子表的部分内容: KEY parent_table_id (parent_table_id), CONSTRAINT id_ibfk_1 FOREIGN KEY (parent_table_id) REFERENCES parent_table (parent_table_id) - Salman Quader
我已经有现有的子类。那么我如何手动设置键、约束和引用呢?这是否可能? - Salman Quader
非常感谢@Thamizhan 我可以得到你的社交ID吗? - Salman Quader
@SalmanQuader 欢迎!如果有帮助,请不要忘记标记为已解决! - Thamilhan
ALTER TABLE distribute_task ADD CONSTRAINT id_ibfk_1 FOREIGN KEY (project_id) REFERENCES project_list (id) ON DELETE CASCADE 当我在SQL中执行此代码时,我会得到一个SQL错误。 |错误 SQL查询:ALTER TABLE distribute_task ADD CONSTRAINT id_ibfk_1 FOREIGN KEY (project_id) REFERENCES project_list (id) ON DELETE CASCADEMySQL说:文档 #1005-无法创建表arenaco_login.#sql-aa0_4fd(errno:121“写入或更新时重复键”)(详细信息...) | 为什么? - Salman Quader

0

请直接提供最新链接,或者更好的方式是在此引用所有相关信息。 - Pablo Bianchi

-1
function delete($id){
$query = "DELETE FROM parent_table WHERE id = $id";
$query = "DELETE FROM child_table WHERE parent_table_id = $id";
$result = mysqli_query($connect, $query) or die(mysqli_error($connect));
return true;
}

我需要一个单一的查询,而不是多个查询。 - Salman Quader

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接