在许多
情况下,对于外键使用更复杂的逻辑表达式是非常有用的。此外,在某些情况下,在索引视图中
创建约束也很有用。我将举一个例子,希望本文的投票链接能尽快添加。
当外键中需要更复杂的逻辑表达式时
考虑下面简单的常识:设备的最大电流不能超过插入电路的最大电流。假设下列表存储电路和设备数据是:
复制代码代码如下所示:
创建表的数据。电路(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的实用性。