博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于数据的级联删除和更新
阅读量:6585 次
发布时间:2019-06-24

本文共 2670 字,大约阅读时间需要 8 分钟。

很多时候,我们会碰到这样的场景:“删除一个表的数据的时候,将另一个表的相关数据删除。

 

在这里我建立两张表:“ProductCategory”,“Product”.

有一个需求是这样的:在删除某个ProductCategory 的时候,同时删除该Category的products.

 

这里是创建两张表的脚本:

CREATE TABLE [dbo].[ProductCategory](    [Id] [uniqueidentifier] NOT NULL,    [Name] [varchar](50) NULL, CONSTRAINT [PK_ProductCategory] PRIMARY KEY CLUSTERED (    [Id] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]

 

CREATE TABLE [dbo].[Product](    [Id] [uniqueidentifier] NOT NULL,    [CategoryId] [uniqueidentifier] NULL,    [Name] [varchar](50) NULL,    [Price] [decimal](18, 0) NOT NULL, CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED (    [Id] ASC)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]

 

创建后的表大致如下:

 

一些实验数据:

INSERT INTO [Test].[dbo].[ProductCategory] VALUES('4B07A7D0-B56A-4DE3-9F55-972AC6D60994','category1');INSERT INTO [Test].[dbo].[Product] VALUES(newid(),'4B07A7D0-B56A-4DE3-9F55-972AC6D60994','product1','1');INSERT INTO [Test].[dbo].[Product] VALUES(newid(),'4B07A7D0-B56A-4DE3-9F55-972AC6D60994','product2','2');INSERT INTO [Test].[dbo].[Product] VALUES(newid(),'4B07A7D0-B56A-4DE3-9F55-972AC6D60994','product3','3');INSERT INTO [Test].[dbo].[Product] VALUES(newid(),'4B07A7D0-B56A-4DE3-9F55-972AC6D60994','product4','4');

有很多种方法可以实现这个功能:

 

在模型层中处理:

public class ProductCategoryRepository{    public bool DeleteCategory(ProductCategory category)    {         // 删除Category        // 删除该Category 下面的products.    }}

 

这个比较简单也很容易理解,但是它有个问题:如果是直接通过执行SQL 来删除Category的。那么这个约束就无法满足了,或者是说你必须记得如果要删除Category的话,那么就应该使用DeleteCategory方法

 

于是第二种方法出现了:

通过触发器来级联删除:

具体的触发器代码如下:

Create TRIGGER [dbo].[DeleteRelatedProducts] ON  [dbo].[ProductCategory] AFTER DELETEAS BEGIN    SET NOCOUNT ON;    delete from [dbo].[product] where categoryId in     (        select id from deleted    )END

这种方式比较简单,而且语法也很明了:

具体资料可以参照:

 

还有一种方式可能并不是很多人知道:

外键的级联删除和更新:

在sql server 中可以通过设置外键的级联删除和更新来实现这个功能。

这里是外键的定义:来自

简介

外键(Foreign Key)

如果在一个关系中是,那么这个公共关键字被称为另一个关系的外键。由此可见,外键表示了两个关系之间的联系。以另一个关系的外键作的表被称为主表,具有此外键的表被称为主表的从表。外键又称作。换而言之,如果关系模式R中的某属性集不是R的,而是另一个关系R1的主键则该属性集是关系模式R的外键,通常在中缩写为FK。

外键的作用

保持,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值或使用空值

 

我们现在的要求是删除ProductCategory的时候,同时删除该ProductCategory下面的Product

所以应该在Product 表中建立外键约束,

 

看到删除规则了吗,指定为层叠的话,那么当删除ProductCategory的时候,就会删除Product了。

 
select * from ProductCategory;select * from product;Delete from ProductCategory;select * from ProductCategory;select * from product;

结果如下:

本文转自LoveJenny博客园博客,原文链接:http://www.cnblogs.com/LoveJenny/archive/2012/12/31/2840238.html,如需转载请自行联系原作者
你可能感兴趣的文章
Ubuntu上安装bind9
查看>>
访问共享提示“服务器存储空间不足,无法处理此命令。”
查看>>
第七章 虚拟化 虚拟机备份 Veeam backup &Replication
查看>>
路由器与交换机的密码恢复
查看>>
Cisco路由器上的IPSec协议(站点到站点的×××)
查看>>
Linux Python详细安装、升级指南
查看>>
无法修复ie使用代理服务器
查看>>
教你给IDEA安装插件
查看>>
隐蔽可扩展PHP Webshell – Weevely 1.0
查看>>
如何让Yii框架支持多个数据库
查看>>
用函数指针读取并调用虚函数表指向的每个函数
查看>>
Mysql查询ip段
查看>>
办公小贴士之:在Outlook 2010中添加农历生日
查看>>
我的友情链接
查看>>
ActionScript 3.0游戏编程——创建简单的ActionScript程序
查看>>
函数const
查看>>
关于“Return empty arrays or collections, not nulls”的思考
查看>>
UUID为36位
查看>>
CodeForces-1167E-Range Deleting
查看>>
兼容多个版本程序集的web.config配置
查看>>