mysql - 从具有分层数据的表中删除记录

标签 mysql sql database

我在 SQL 数据库中有两个表,其字段如下:

Table A: Key | Id1 | Name

Table B: Key | Id2 | Idx1 | Idx2 | Id1

表 B 存储分层数据。表 B 中的字段 Id1 链接回表 A 中的 Id1,并设置 FK,以便删除表 1 中的项目(比如 Id1=1)将删除表 B 中的所有项目(具有相同的 Id1)(即。级联)。

我想做的是,对于表 B 中删除了某个 Id1 的记录(由于表 A 中具有相同 Id1 的记录),表 B 中具有相同 Id2 的所有记录也被删除。

例如……

Table A:
  1,1,A
  2,2,B
  3,3,C

Table B:
  1,1,0,0,1
  2,1,0,1,2
  3,1,0,2,3
  4,1,1,0,3
  5,1,1,1,2
  6,2,0,0,3

我现在从表 A 中删除项目 1(Id1=1),这样:

Table A:
  2,2,B
  3,3,C

Table B:
  6,2,0,0,3

这可以在 SQL 中自动完成(例如,通过触发器等)还是我需要在数据库外部“手动”处理它?<​​/p>

最佳答案

在这种情况下,您可以利用 SQL Server 的 DELETE CASCADE 功能。

如果您在 SQL 中的两个表之间有父子映射,您可以删除子表记录以及删除父记录的单个查询。

要实现此目的,您必须在建立表之间的关系时启用删除级联,方法如下:

CREATE TABLE products
( product_id INT PRIMARY KEY,
  product_name VARCHAR(50) NOT NULL,
  category VARCHAR(25)
);

CREATE TABLE inventory
( inventory_id INT PRIMARY KEY,
  product_id INT NOT NULL,
  quantity INT,
  min_level INT,
  max_level INT,
  CONSTRAINT fk_inv_product_id
    FOREIGN KEY (product_id)
    REFERENCES products (product_id)
    ON DELETE CASCADE
);

或者,如果您已经定义了表数据,则可以使用以下方法来执行此操作:

ALTER TABLE dbo.T2
   DROP CONSTRAINT FK_T1_T2   -- or whatever it's called

ALTER TABLE dbo.T2
   ADD CONSTRAINT FK_T1_T2_Cascade
   FOREIGN KEY (EmployeeID) REFERENCES dbo.T1(EmployeeID) ON DELETE CASCADE

或者如果您使用的是 MYSQL(因为它没有在问题中提及),您可以按照以下 StackOverflow 帖子中的说明进行操作:

MySQL foreign key constraints, cascade delete

关于mysql - 从具有分层数据的表中删除记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44491798/

相关文章:

mysql - 如何使用sql查询结果进行轮换?

PHP。输入密码点击按钮

mysql - 使用一个公共(public)列名使两列的两种组合唯一

sql - 在 Oracle 中,如何为现有表创建 "CREATE TABLE..."语法?

iOS - 如何处理在线/离线数据

java - 从数据库表中随机选择实体?

php - 从当前时间获取数据

mysql - 如果我更新一个 SQL 表方案。我是否必须更新所有用户数据库链接表?

SQL Server 插入触发器改进

mysql - SQL LEFT JOIN 作用于两个可能的列