SQLServer约束增强的两点建议

SQLServer约束增强的两点建议
在许多情况下,对于外键使用更复杂的逻辑表达式是非常有用的。此外,在某些情况下,在索引视图中创建约束也很有用。我将举一个例子,希望本文的投票链接能尽快添加。
当外键中需要更复杂的逻辑表达式时
考虑下面简单的常识:设备的最大电流不能超过插入电路的最大电流。假设下列表存储电路和设备数据是:
复制代码代码如下所示:
创建表的数据。电路(curcuitid INT NOT NULL)
pk_curcuits主键约束,
最大电流INT NOT NULL,
varchar(100)描述不为空);

插入数据。电路(curcuitid,
MaximumCurrent,
描述)
选择1, 25,'deck和车库;

创建表的数据。设备(DeviceID INT NOT NULL)
pk_devices主键约束,
CurcuitID INT NULL,
最大电流INT NOT NULL,
varchar(100)不为空的描述,
fk_devices_curcuits外键约束(curcuitid)
引用数据电路(curcuitid)。
);


发出一个简单的命令和实现将非常方便。
一个非常简单的命令可能实现这个业务规则:
修改表数据。设备添加约束fk_devices_curcuits
外键(curcuitid,最大电流)
引用数据电路(curcuitid,最大电流)。
赛((data.devices.curcuitid =数据。电路。curcuitid)和
(data.devices.maximumcurrent数据。电路。MaximumCurrent));
然而,它是不支持的,所以我需要使用一种替代方法
但是,不支持此语句,因此必须采用其他方法——添加一个约束列,并使用3个而不是1个约束,如下所示:
修改表数据。电路
添加约束unq_curcuits独特(curcuitid,MaximumCurrent);

修改表数据。设备添加curcuitmaximumcurrent int空;

修改表的数据的设备fk_devices_curcuits约束;

修改表数据。设备添加约束fk_devices_curcuits
外键(curcuitid,CurcuitMaximumCurrent)
引用数据电路(curcuitid,最大电流)。
更新级联;

更改表数据。设备
添加约束chk_devices_sufficientcurcuitmaximumcurrent
检查(curcuitmaximumcurrent =最大电流);

您可以验证约束是否起作用
您可以验证约束是否有效:
插入数据。设备(DeviceID,
CurcuitID,
MaximumCurrent,
curcuitmaximumcurrent,
描述)
选择1, 1, 50,25,被称为车载充电器
MSG 547,第16级,状态0,第1行
INSERT语句不符合检查约束chk_devices_sufficientcurcuitmaximumcurrent 。冲突,chk_devices_sufficientcurcuitmaximumcurrent,
语句已终止。
与CHECK约束chk_devices_sufficientcurcuitmaximumcurrentINSERT语句的冲突。这种冲突发生在数据。设备测试数据库表。
语句终止。
正如你所看到的,实现的非常简单和简单,它也被称为是非。
正如您所看到的,一个非常简单和普通的业务规则相当复杂,因为数据库引擎不直接支持这个业务规则。
当您想在索引视图上创建约束时
在索引视图上创建约束
即使您的数据库保证您、当前和它的最大电流也被称为以下两个方面。
虽然数据库确保设备的最大电流不超过插入电路的最大电流,但这是不够的。请看下面的示例数据:
插入数据。设备(DeviceID,
CurcuitID,
MaximumCurrent,
curcuitmaximumcurrent,
描述)
选择2, 1, 15,25,'shopvac;
插入数据。设备(DeviceID,
CurcuitID,
MaximumCurrent,
curcuitmaximumcurrent,
描述)
选择3, 1, 15,25,'miter看见;
数据库结构允许在一个电路中插入多个设备,这是正确的,但是如果同时打开两个设备,它们的组合最大电流超过电路的最大电流。为了执行这个业务规则,创建索引视图是很自然的,这样数据库就保证了总数总是正确的:
数据库中的数据表明可以在电路中插入多个设备。这并没有错,但是当所有的设备都打开时,最大电流将超过电路的最大电流。为了加强这个业务规则,创建索引视图以确保数据库始终正确以保证当前的状态是很自然的。
data.totalmaximumcurrentpercircuit WITHSCHEMABINDING创建视图
作为
选择d.curcuitid,
c.maximumcurrent作为circuitmaximumcurrent,
和(d.maximumcurrent)作为totalmaximumcurrent,
count_big(*)为numdevices
从数据。设备D加入数据。电路C d.curcuitid = c.curcuitid
集团通过d.curcuitid,c.maximumcurrent;

创建聚集索引data_totalmaximumcurrentpercircuit
在data.totalmaximumcurrentpercircuit(curcuitid);

如果我可以在索引视图上创建一个检查约束
如果您可以在这个索引视图上创建一个约束,我会这样做:
改变视图data.totalmaximumcurrentpercircuit
添加约束chk_totalmaximumcurrentpercircuit_validcurcuit
检查(totalmaximumcurrent circuitmaximumcurrent)
Instead, I need to use triggers or rather contrived kludges. a,从以下两个方面收集。
事实上,我必须使用触发器或仔细检查的检查约束。如果数据库对这个常见的业务规则有内置的支持,它将增加SQL Server的实用性。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部