【问题标题】:Deleting records from a table with heirachial data从具有分层数据的表中删除记录
【发布时间】:2017-06-12 05:12:29
【问题描述】:

我在 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 中自动完成(例如,通过触发器等),还是我需要在数据库之外“手动”处理?

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    在这种情况下,您可以利用 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

    【讨论】:

    • 我可以看到这将如何删除表 B 中具有相同 Id1 的(单个)记录。我想要的是删除该记录(Key=1),然后删除与表 B 中的记录具有相同 Id2 的所有记录(Key=2、3、4 和 5)。 (我已经更新了问题,因为我将键值留在了表 B 中。)
    • 我可以看到这将如何删除表 B 中具有相同 Id1 的(单个)记录。我想要的是删除该记录(Key=1),然后删除与表 B 中的记录具有相同 Id2 的所有记录(Key=2、3、4 和 5)。 (我已经更新了问题,因为我离开了表 B 的键值。)如果在表 A(记录 i)中删除具有 Id1 的元素,则删除表 B 中具有相同 Id1 的任何元素(通过级联)(记录 ii),但表 B 中具有相同 Id2(与记录 ii)的任何记录也是如此。
    猜你喜欢
    • 2015-03-15
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多