我在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中自动完成(例如通过触发器等),还是需要在数据库外“手动”处理?
答案 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帖子的说明进行操作: