关于数据的级联删除和更新

简介:

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

 

在这里我建立两张表:“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]

 

创建后的表大致如下:

B6BCCB218C4946999A038748EDD3169C

D2AA9CB97D5E4921BF534E512CC55C88

 

一些实验数据:

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 DELETE
AS 
BEGIN
    SET NOCOUNT ON;
    delete from [dbo].[product] where categoryId in 
    (
        select id from deleted
    )
END

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

具体资料可以参照:http://msdn.microsoft.com/en-us/library/ms191300(SQL.105).aspx

 

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

外键的级联删除和更新:

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

这里是外键的定义:来自http://baike.baidu.com/view/68073.htm

简介

外键(Foreign Key)

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

外键的作用

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

 

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

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

41CAF4CCE0594D539B8FE9DFF831BC31

 

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

 
 
select * from ProductCategory;
select * from product;

Delete from ProductCategory;

select * from ProductCategory;
select * from product;

结果如下:

8DD435ED59A34A0EB60B4D7AC9A81A07






本文转自LoveJenny博客园博客,原文链接:http://www.cnblogs.com/LoveJenny/archive/2012/12/31/2840238.html,如需转载请自行联系原作者
目录
相关文章
|
9月前
update 批量更新某条数据时取最新、最大的一笔更新
update 批量更新某条数据时取最新、最大的一笔更新
52 0
|
6月前
UPSERT操作只能对已经存在的分区进行更新或插入操作
UPSERT操作只能对已经存在的分区进行更新或插入操作
31 2
|
6月前
|
Oracle 关系型数据库 MySQL
根据一张表更新另一张表
根据一张表更新另一张表
|
11月前
|
SQL 关系型数据库 MySQL
使用tkmapper避免更新on update字段
使用tkmapper避免更新on update字段
103 0
|
SQL 安全 数据库
如何向表中插入数据以及如何更新、删除表中的数据
1. 插入 INSERT 用来将行插入到数据库表中。插入有几种方式: 插入完整的行。 插入行的一部分。 插入某些查询的结果。 INSERT 语法要求指定表名和插入到新表中的值。例如,我们将一个新顾客插入到 customers 表中。 插入前: INSERT INTO Customers VALUES('1000000006', 'Toy Land', '123 Any Street', 'New York', 'NY', '11111', 'USA', 'Jordan', 'Jordan@gmail.com'); 运行结果如下: 插入到新表中的值由 VALUES 子
125 0
|
SQL 关系型数据库 MySQL
MySql数据库Update批量更新与批量更新多条记录的不同值实现方法
MySql数据库Update批量更新与批量更新多条记录的不同值实现方法
1978 0
|
关系型数据库 MySQL 数据库
更新表数据|学习笔记
快速学习更新表数据
|
存储 C#
C# 如何物理删除有主外键约束的记录?存储过程实现
十年河东,十年河西,莫欺少年穷 本篇主旨是如何物理删除有主外键约束的记录!那么,我们从主外键走起! 下面新建三张有主外键约束的表,分别为:系/学院表,专业班表,学生表,如下: CREATE TABLE Dept--系/学院表 ( DeptId int identity(1,1) primary k...
1111 0
|
SQL 存储 数据库
关于数据的级联删除和更新
原文:关于数据的级联删除和更新 很多时候,我们会碰到这样的场景:“删除一个表的数据的时候,将另一个表的相关数据删除。”   在这里我建立两张表:“ProductCategory”,“Product”.
890 0