使用heirachial数据从表中删除记录

时间:2017-06-12 05:12:30

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

1 个答案:

答案 0 :(得分: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