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

简介: 原文:关于数据的级联删除和更新很多时候,我们会碰到这样的场景:“删除一个表的数据的时候,将另一个表的相关数据删除。”   在这里我建立两张表:“ProductCategory”,“Product”.
原文: 关于数据的级联删除和更新

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

 

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

目录
相关文章
|
NoSQL 算法 JavaScript
Redis 实现限流的三种方式
Redis 实现限流的三种方式
|
机器学习/深度学习 人工智能 运维
智能化运维:AI与大数据在IT运维中的应用探索####
本文旨在探讨人工智能(AI)与大数据分析技术如何革新传统IT运维模式,提升运维效率与服务质量。通过具体案例分析,揭示AI算法在故障预测、异常检测及自动化修复等方面的实际应用成效,同时阐述大数据如何助力实现精准运维管理,降低运营成本,提升用户体验。文章还将简要讨论实施智能化运维面临的挑战与未来发展趋势,为IT管理者提供决策参考。 ####
|
JavaScript Java 测试技术
基于SpringBoot+Vue的技术疫情防控自动售货机系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的技术疫情防控自动售货机系统的详细设计和实现(源码+lw+部署文档+讲解等)
200 7
|
关系型数据库 MySQL 数据库
[已解决]Mysql想删掉一个表里所有的数据,直接删总是卡住
[已解决]Mysql想删掉一个表里所有的数据,直接删总是卡住
557 0
|
消息中间件 Java Kafka
Apache Kafka - 灵活控制Kafka消费_动态开启/关闭监听实现
Apache Kafka - 灵活控制Kafka消费_动态开启/关闭监听实现
2285 1
|
人工智能 文字识别 API
阿里云视觉智能开放平台QPS限制提升操作Quick Start
阿里云视觉智能开放平台简称视觉智能平台,是基于阿里巴巴视觉智能技术实践经验,面向视觉智能技术企业和开发商(含开发者),为其提供高易用、普惠的视觉API服务,帮助企业快速建立视觉智能技术应用能力的综合性视觉AI能力平台。使用阿里云视觉智能开放平台服务时,大部分能力都会限制QPS,具体的QPS限制和每个能力的付费方式有关。如果您只是开通了能力,默认QPS限制不超过2。当调用频率超出QPS限制,会触发限流,导致调用报错。对于支持资源包的能力,可以购买资源包,购买后会在次日早8点提升QPS限制,一般能够提升到5QPS。然而一些新老客户往往不了解这一方式,本文简单说明和演示一下提升操作以供参考。
1032 0
阿里云视觉智能开放平台QPS限制提升操作Quick Start
|
算法 C++
降维算法:主成分分析 VS 自动编码器(三)
降维算法:主成分分析 VS 自动编码器(三)
304 1
降维算法:主成分分析 VS 自动编码器(三)
alipay.trade.query(统一收单线下交易查询)集成流程
接口名称:统一收单线下交易查询 英文名称:alipay.trade.query 用于查询订单是否存在以及订单的详细信息; 一、文档地址 官方文档地址:[url]https://docs.open.alipay.com/api_1/alipay.trade.query/[/url] 二、开发前准备工作 调用步骤:[url]https://openclub.alipay.com/read.php?tid=12194&fid=69[/url] 注意事项:1、支持沙箱测试;2、需签约并添加功能;3、支持第三方调用。
3374 12
让你提前认识软件开发(16):如何对程序进行优化?
第1部分 重新认识C语言 如何对程序进行优化?            对程序进行优化,是软件开发工程师必然会涉及到的问题。那么为什么要对程序进行优化呢?原因有以下几个:         第一,在原程序基础之上新增、删除或修改了功能,需要改变原程序流程。
1054 0
|
3天前
|
人工智能 自然语言处理 JavaScript
2026年Windows+Ollama本地部署OpenClaw保姆级教程:本地AI Agent+阿里云上快速搭建
2026年OpenClaw凭借本地部署、私有化运行的特性,成为打造个人智能体的核心工具,而Ollama作为轻量级本地大模型管理工具,能让OpenClaw摆脱对云端大模型的依赖,实现**本地推理、数据不泄露、全流程私有化**的智能体验。本文基于Windows 11系统,从硬件环境准备、Ollama安装与模型定制、OpenClaw部署配置、技能扩展到常见问题排查,打造保姆级本地部署教程,同时补充阿里云OpenClaw(Clawdbot)快速部署步骤,兼顾本地私有化需求与云端7×24小时运行需求,文中所有代码命令均可直接复制执行,确保零基础用户也能快速搭建属于自己的本地智能体。
5298 29

热门文章

最新文章