比较SQL Server约束和DML触发器

作者:佚名 来源:ChinaItLab 时间:2008-12-24 15:54:00 

这些年来,我发现许多开发者对于何时使用数据操纵语言(DML)触发器与何时使用约束感到迷惑。许多时候,如果没有正确应用这两个对象,就会造成问题。本文将为您何时使用约束和DML触发器提供一些启示,以帮助你避免我遇到的纠正问题。

何为约束和DML触发器?

约束是数据库引擎用来约束一个表或一个表关系中的数据,以维持数据库完整性的一个对象。这些约束包括CHECK、UNIQUE、PRIMARY KEY等。这里提供在TSQL中定义约束的更多细节。

AFTER触发器是一种特殊类型的TSQL代码块,当一个DML语句根据触发器定义的表执行时,它得到执行。(在本文中我仅指这种触发器。)

何时使用约束和DML触发器

使用约束比使用触发器更加有利(如果你可以使用约束的话)。你总是可以写出一个触发器,完成和一个约束相同的工作,但这样做一般没有什么意义。

考虑使用一个外键约束和DML触发器。使用外键约束的目的是为了确保允许进入一个表的一列或多列的值出现在一个单独表的一列或多列中。你可以使用DML触发器建立相同的功能。

列表A建立了SalesHistory和I_SalesProducts表,我将在例子中使用它们,并给它们加载一些数据。

IF OBJECT_ID('SalesHistory')>0

DROP TABLE SalesHistory;

GO

CREATE TABLE [dbo].[SalesHistory]

(

[SaleID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,

[Product] [varchar](10) NULL,

[SaleDate] [datetime] NULL,

[SalePrice] [money] NULL

)

GO DECLARE @i SMALLINT

SET @i = 1WHILE (@i <=100)

BEGIN

INSERT INTO SalesHistory(Product, SaleDate, SalePrice)

VALUES('Computer', DATEADD(mm, @i, '3/11/1919'), DATEPART(ms, GETDATE()) + (@i + 57))

INSERT INTO SalesHistory(Product, SaleDate, SalePrice)

VALUES('BigScreen', DATEADD(mm, @i, '3/11/1927'), DATEPART(ms, GETDATE()) + (@i + 13))

INSERT INTO SalesHistory(Product, SaleDate, SalePrice)

VALUES('PoolTable', DATEADD(mm, @i, '3/11/1908'), DATEPART(ms, GETDATE()) + (@i + 29))SET @i = @i + 1

END

GOINSERT INTO l_SalesProducts(Product)

SELECT 'BigScreen'

UNION

SELECT 'Computer'

UNION

SELECT 'PoolTable'

现在我有了一些表和一些数据可供利用,让我们在SaleHistory表中建立一个外键约束。

ALTER TABLE SalesHistory

ADD CONSTRAINT fk_SalesHistory FOREIGN KEY (Product) REFERENCES

l_SalesProducts(Product)

标签:
0
投稿

猜你喜欢

  • MySQL实现批量插入以优化性能的教程

    2024-01-25 23:27:53
  • Python减肥小工具轻松帮你瘦

    2021-07-20 09:54:41
  • python代码实现学生信息管理系统

    2023-02-06 18:31:34
  • Python importlib模块重载使用方法详解

    2021-02-28 18:12:21
  • 带农历及节日的js日历源码

    2010-08-01 17:38:00
  • python实现矩阵和array数组之间的转换

    2022-03-19 16:31:21
  • python中异常捕获方法详解

    2021-10-30 10:06:09
  • Golang 使用Map实现去重与set的功能操作

    2024-02-21 14:54:21
  • python实现Pyecharts实现动态地图(Map、Geo)

    2021-01-21 11:33:58
  • 用sql实现18位身份证校验代码分享 身份证校验位计算

    2024-01-13 13:37:11
  • PHP实现的注册,登录及查询用户资料功能API接口示例

    2024-04-30 08:50:18
  • 2020年10款优秀的Python第三方库,看看有你中意的吗?

    2021-01-03 10:35:08
  • PHP设计模式 注册表模式(多个类的注册)

    2023-11-20 06:45:13
  • MySQL的一些安全注意点

    2008-12-24 16:29:00
  • 下载糗事百科的内容_python版

    2022-02-08 12:39:29
  • 解决Django响应JsonResponse返回json格式数据报错问题

    2022-12-07 00:06:02
  • PHP设计模式之模板方法模式Template Method Pattern详解

    2023-05-25 00:24:26
  • django自带的权限管理Permission用法说明

    2023-07-25 04:18:06
  • Python语法学习之正则表达式的量词汇总

    2023-07-20 03:08:59
  • python的简单web框架flask快速实现详解

    2023-03-10 08:26:36
  • asp之家 网络编程 m.aspxhome.com