广告
返回顶部
首页 > 资讯 > 数据库 >SQL Server中怎么实现约束增强
  • 166
分享到

SQL Server中怎么实现约束增强

2024-04-02 19:04:59 166人浏览 薄情痞子
摘要

SQL Server中怎么实现约束增强,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在许多情况下,对外键使用更复杂的逻辑表达式是非常有用的。

SQL Server中怎么实现约束增强,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

在许多情况下,对外键使用更复杂的逻辑表达式是非常有用的。 此外,在某些情况下能够在索引视图创建约束也将非常实用。 我将举例说明,同时我希望针对此文的投票链接会尽快加上。当外键中需要更为复杂的逻辑表达式时 考虑下面的简单常识: 您的设备的最大电流不能超过您插入到它的电路的最大电流。 假设下面的表存储电路和设备数据:复制代码 代码如下: CREATE TABLE Data.Curcuits(CurcuitID INT NOT NULL CONSTRaiNT PK_Curcuits PRIMARY KEY, MaximumCurrent INT NOT NULL, Description VARCHAR(100) NOT NULL); Go INSERT INTO Data.Curcuits(CurcuitID, MaximumCurrent, Description) SELECT 1, 25, 'Deck and Garage'; GO CREATE TABLE Data.Devices(DeviceID INT NOT NULL CONSTRAINT PK_Devices PRIMARY KEY, CurcuitID INT NULL, MaximumCurrent INT NOT NULL, Description VARCHAR(100) NOT NULL, CONSTRAINT FK_Devices_Curcuits FOREIGN KEY(CurcuitID) REFERENCES Data.Curcuits(CurcuitID) ); GO

It would be very convenient to issue a simple command and implement this business rule: 一个非常简便的命令就可能实现这个业务规则: ALTER TABLE Data.Devices ADD CONSTRAINT FK_Devices_Curcuits FOREIGN KEY(CurcuitID, MaximumCurrent) REFERENCES Data.Curcuits(CurcuitID, MaximumCurrent) MATCH ON((Data.Devices.CurcuitID = Data.Curcuits.CurcuitID) AND (Data.Devices.MaximumCurrent <= Data.Curcuits.MaximumCurrent)); However, it is not supported, so I need to use a workaround, one more column and three constraints instead of one, as follows: 然而,该语句并不被支持,所以必须采用其他办法——多增加一列约束,使用3个而不是1个约束,如下所示: ALTER TABLE Data.Curcuits ADD CONSTRAINT UNQ_Curcuits UNIQUE(CurcuitID, MaximumCurrent); GO ALTER TABLE Data.Devices ADD CurcuitMaximumCurrent INT NULL; GO ALTER TABLE Data.Devices DROP CONSTRAINT FK_Devices_Curcuits; GO ALTER TABLE Data.Devices ADD CONSTRAINT FK_Devices_Curcuits FOREIGN KEY(CurcuitID, CurcuitMaximumCurrent) REFERENCES Data.Curcuits(CurcuitID, MaximumCurrent) ON UPDATE CASCADE; GO ALTER TABLE Data.Devices ADD CONSTRAINT CHK_Devices_SufficientCurcuitMaximumCurrent CHECK(CurcuitMaximumCurrent >= MaximumCurrent); GO You can verify that the constraints work: 你可以验证该约束有效: INSERT INTO Data.Devices(DeviceID, CurcuitID, MaximumCurrent, CurcuitMaximumCurrent, Description) SELECT 1, 1, 50, 25, 'Electric car charger' Msg 547, Level 16, State 0, Line 1 The INSERT statement conflicted with the CHECK constraint "CHK_Devices_SufficientCurcuitMaximumCurrent". The conflict occurred in database "Test", table "data.Devices". The statement has been terminated. INSERT 语句和CHECK约束"CHK_Devices_SufficientCurcuitMaximumCurrent"发生冲突。 该冲突发生在数据库"Test"的"data.Devices"表。 该语句被终止执行。 As you have seen, the implementation of a very simple and very common business rule is quite involved, because such business rules are not directly supported by the database engine. 可以看出,一个非常简单而普通的业务规则实现起来也相当繁杂,因为数据库引擎并不直接支持这种业务规则。 When you want to create constraints on indexed views 在索引视图上创建约束 Even when your database guarantees that “the maximum current of your device cannot exceed the maximum current of the circuit you plug it into”, it is not good enough. Consider the following sample data: 尽管数据库保证“您的设备的最大电流不能超过您插入到它的电路的最大电流”,但这还不够。请看下列示例数据: INSERT INTO Data.Devices(DeviceID, CurcuitID, MaximumCurrent, CurcuitMaximumCurrent, Description) SELECT 2, 1, 15, 25, 'ShopVac'; INSERT INTO Data.Devices(DeviceID, CurcuitID, MaximumCurrent, CurcuitMaximumCurrent, Description) SELECT 3, 1, 15, 25, 'Miter Saw'; The database structure allows to plug more than one device into a circuit, which is correct, but if you turn both devices on, their combined maximum current exceeds the circuit's maximum current. To enforce this business rule, it would be natural to create an indexed view, so that the database guarantees that the totals are always correct: 数据库中的数据表明可以插入一个以上的设备到电路,这没有错,可是当所有的设备都打开时,它们的最大电流之和会超过电路最大电流。为了加强这个业务规则,很自然的会创建一个索引视图以使数据库保证电流之和总是正确的。 CREATE VIEW Data.TotalMaximumCurrentPerCircuit WITH SCHEMABINDING AS SELECT d.CurcuitID, c.MaximumCurrent AS CircuitMaximumCurrent, SUM(d.MaximumCurrent) AS TotalMaximumCurrent, COUNT_BIG(*) AS NumDevices FROM Data.Devices d JOIN Data.Curcuits c ON d.CurcuitID = c.CurcuitID GROUP BY d.CurcuitID, c.MaximumCurrent; GO CREATE UNIQUE CLUSTERED INDEX Data_TotalMaximumCurrentPerCircuit ON Data.TotalMaximumCurrentPerCircuit(CurcuitID); GO If I could create a check constraint on that indexed view, I would be all set: 如果能在该索引视图上创建一个约束,我将进行这样的设置: ALTER VIEW Data.TotalMaximumCurrentPerCircuit ADD CONSTRAINT CHK_TotalMaximumCurrentPerCircuit_ValidCurcuit CHECK(TotalMaximumCurrent <= CircuitMaximumCurrent) Instead, I need to use triggers or rather contrived kludges. A built in native support for such quite common business rules would increase the usefulness of sql Server. 实际上,我必须使用触发器或者精心拼凑Check约束来实现。如果数据库内置支持这种相当普遍的业务规则,那将会增加SQL Server的实用性 。

看完上述内容,你们掌握SQL Server中怎么实现约束增强的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网数据库频道,感谢各位的阅读!

您可能感兴趣的文档:

--结束END--

本文标题: SQL Server中怎么实现约束增强

本文链接: https://www.lsjlt.com/news/58355.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SQL Server中怎么实现约束增强
    SQL Server中怎么实现约束增强,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在许多情况下,对外键使用更复杂的逻辑表达式是非常有用的。 ...
    99+
    2022-10-18
  • SQL Server 中怎么创建约束
    今天就跟大家聊聊有关SQL Server 中怎么创建约束,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。什么是主键?在数据库中,常常不只是一个表,这些...
    99+
    2022-10-18
  • SQL Server主键约束怎么创建
    这篇“SQL Server主键约束怎么创建”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看...
    99+
    2022-10-19
  • SQL Server中的约束有什么用
    SQL Server中的约束用于限制对数据库表中数据的插入、更新和删除操作,以确保数据的完整性和一致性。约束可以定义在列级别或表级别...
    99+
    2023-08-17
    SQL Server
  • SQL SERVER中怎么实现自增列
    这期内容当中小编将会给大家带来有关SQL SERVER中怎么实现自增列,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。declare @Table_name varcha&...
    99+
    2022-10-18
  • sql中check约束怎么使用
    在SQL中,CHECK约束用于限制表中列的取值范围。它可以用于检查特定条件是否为真,并只允许满足条件的值插入到表中。使用CHECK约...
    99+
    2023-10-27
    sql
  • SQL Server2008中怎么创建约束
    SQL Server2008中怎么创建约束,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1 、 Primary Key...
    99+
    2022-10-18
  • 怎么在sql表中添加约束
    在SQL表中可以使用以下方法添加约束:1. 主键约束(Primary Key Constraint):指定一个或多个列作为主键,保证...
    99+
    2023-08-18
    sql
  • SQL语法中CONSTRAINT约束怎么用
    小编给大家分享一下SQL语法中CONSTRAINT约束怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!CONSTRAINT约束,即对数据库表中的数据进行约束,...
    99+
    2023-06-26
  • MySQL约束之默认约束default与零填充约束zerofill怎么实现
    本篇内容主要讲解“MySQL约束之默认约束default与零填充约束zerofill怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL约束之默认约束default与零填充约束zer...
    99+
    2023-07-02
  • SQL Server中怎么实现自动增长清零
    本篇文章给大家分享的是有关SQL Server中怎么实现自动增长清零,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。方法1:代码如下: ...
    99+
    2022-10-18
  • mysql中怎么实现一个完整性约束
    这篇文章将为大家详细讲解有关mysql中怎么实现一个完整性约束,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。约束条件作用:用于保证数据的完整性和一致性主要分...
    99+
    2022-10-18
  • sql server中怎么实现分页
    这篇文章将为大家详细讲解有关sql server中怎么实现分页,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。具体如下:declare @index...
    99+
    2022-10-18
  • SQL Server中怎么设置主键自增长
    SQL Server中怎么设置主键自增长,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.新建一数据表,里面有字段id,将id...
    99+
    2022-10-18
  • sql server中怎么设置ID字段自增
    sql server中怎么设置ID字段自增,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。打开要设置的数据库表,点击要设置的字段...
    99+
    2022-10-18
  • SQL Server中怎么实现子查询
    这篇文章将为大家详细讲解有关SQL Server中怎么实现子查询,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、子查询概念介绍子查询可以嵌套在SELEC&...
    99+
    2022-10-18
  • SQL Server中怎么实现分页存储
    本篇文章给大家分享的是有关SQL Server中怎么实现分页存储,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。创建数据库data_Test :...
    99+
    2022-10-18
  • SQL Server中怎么实现文件操作
    本篇文章为大家展示了SQL Server中怎么实现文件操作,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一,判断文件是否存在存储过程sys.xp_fileexist...
    99+
    2022-10-18
  • sql server中怎么实现递归查询
    sql server中怎么实现递归查询,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。sql server 通过CTE来支持递归查询,这对查...
    99+
    2022-10-18
  • Sql Server中怎么实现数据分页
    Sql Server中怎么实现数据分页,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 方法一:     ...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作