我在 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 - 从具有分层数据的表中删除记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44491798/