sql-server - 创建从多个表中删除数据的过程。SQL 服务器
问题描述
我需要创建一个过程,允许我一次从多个表中删除数据,搜索CUIT
. 这里显示了四个表:
我必须传入一个CUIT
值,如果它与数据库中保存的任何项目匹配,我需要将其删除。我找不到能够一次擦除两个以上表的语法,如果你能帮我一把,我将不胜感激。我怀疑该过程实际上要大得多,总共大约有 12 个表,但由于我只对语法感兴趣,所以我传递了这个片段。
我在尝试使用INNER JOIN
.
我正在使用 SQL Server 2016。谢谢
解决方案
考虑到您的设计,我会在您的外键上实现级联。这是一个示例,但应该让您走上正确的道路:
USE Sandbox;
GO
CREATE TABLE dbo.ParentTable (PK int IDENTITY PRIMARY KEY,
I int);
CREATE TABLE dbo.ChildTable1 (PK int IDENTITY PRIMARY KEY,
FK int,
S varchar(10));
CREATE TABLE dbo.ChildTable2 (PK int IDENTITY PRIMARY KEY,
FK int,
S varchar(10));
CREATE TABLE dbo.ChildTable3 (PK int IDENTITY PRIMARY KEY,
FK int,
S varchar(10));
GO
--Create keys with CASCADE ON DELETE
ALTER TABLE dbo.ChildTable1 ADD CONSTRAINT FK1 FOREIGN KEY (FK) REFERENCES dbo.ParentTable(PK) ON DELETE CASCADE;
GO
ALTER TABLE dbo.ChildTable2 ADD CONSTRAINT FK2 FOREIGN KEY (FK) REFERENCES dbo.ParentTable(PK) ON DELETE CASCADE;
GO
ALTER TABLE dbo.ChildTable3 ADD CONSTRAINT FK3 FOREIGN KEY (FK) REFERENCES dbo.ParentTable(PK) ON DELETE CASCADE;
GO
INSERT INTO dbo.ParentTable (I)
VALUES(1),(7),(9);
INSERT INTO dbo.ChildTable1 (FK,
S)
VALUES(1,'abc'),(3,'def');
INSERT INTO dbo.ChildTable2 (FK,
S)
VALUES(1,'xyz'),(2,'qwe');
INSERT INTO dbo.ChildTable3 (FK,
S)
VALUES(1,'123');
GO
SELECT *
FROM dbo.ParentTable PT
LEFT JOIN dbo.ChildTable1 CT1 ON PT.PK = CT1.PK
LEFT JOIN dbo.ChildTable2 CT2 ON PT.PK = CT2.PK
LEFT JOIN dbo.ChildTable3 CT3 ON PT.PK = CT3.PK;
--1, as we're going to DELETE that
SELECT *
FROM dbo.ChildTable1 CT1
WHERE CT1.FK = 1;
SELECT *
FROM dbo.ChildTable1 CT2
WHERE CT2.FK = 1;
SELECT *
FROM dbo.ChildTable1 CT3
WHERE CT3.FK = 1;
GO
--Perform the DELETE, which will CASCADE to the child tables.
DELETE FROM dbo.ParentTable
WHERE PK = 1;
GO
--no rows
SELECT *
FROM dbo.ParentTable PT
LEFT JOIN dbo.ChildTable1 CT1 ON PT.PK = CT1.PK
LEFT JOIN dbo.ChildTable2 CT2 ON PT.PK = CT2.PK
LEFT JOIN dbo.ChildTable3 CT3 ON PT.PK = CT3.PK;
SELECT *
FROM dbo.ChildTable1 CT1
WHERE CT1.FK = 1;
SELECT *
FROM dbo.ChildTable1 CT2
WHERE CT2.FK = 1;
SELECT *
FROM dbo.ChildTable1 CT3
WHERE CT3.FK = 1;
GO
DROP TABLE dbo.ChildTable3;
DROP TABLE dbo.ChildTable2;
DROP TABLE dbo.ChildTable1;
DROP TABLE dbo.ParentTable;
推荐阅读
- php - 将所选值与表中选中的回显匹配
- javascript - 我可以在 Pixi JS 应用程序中捕获 DOM 鼠标事件吗?
- python - 使用 openpyxl 逐页将 Python CSV 转换为 Excel [未优化]
- html - 使用自定义音频播放器进行音频预览
- libvirt - guest 无法启动:libvirt_lxc 启动失败:无法将挂载目录 /.oldroot/bootflash/a1 绑定到 /bootflash/a1:没有这样的文件 o
- android - 我们可以为应用中的所有订阅设置一个介绍价格吗?
- machine-learning - MultiHeadAttention 的序列编码
- javascript - Prefix a string to json key in javascript
- eclipse - 如何使用 eclipse 运行一个简单的 openMP 示例?
- python - 如何在递归函数中再次要求用户输入