以下脚本创建了vehicle表。你会发现这个脚本和创建先前的那个表的脚本有些不同。首先,在我们设立objid列时,我们用的是IDENTITY(1,1)语句创建的一个恒等式,列中的增量为1。第二,另外一个CONSTRAINT语句增加了外键的关系。
在创建外键时,你在参考表中指定包含外键、参考表一个列或列组合和包含主键的列组合。 CREATE TABLE dbo.vehicle( objid int IDENTITY(1,1) NOT NULL, make varchar(50) NOT ……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
以下脚本创建了vehicle表。你会发现这个脚本和创建先前的那个表的脚本有些不同。首先,在我们设立objid列时,我们用的是IDENTITY(1,1)语句创建的一个恒等式,列中的增量为1。第二,另外一个CONSTRAINT语句增加了外键的关系。在创建外键时,你在参考表中指定包含外键、参考表一个列或列组合和包含主键的列组合。
CREATE TABLE dbo.vehicle( objid int IDENTITY(1,1) NOT NULL, make varchar(50) NOT NULL, model varchar(50)NOT NULL, year char(4) NOT NULL, employee_objid int NOT NULL, CONSTRAINT PK_vehicle PRIMARY KEY (objid), CONSTRAINT FK_vehicle_employee FOREIGN KEY(employee_objid) REFERENCES employee (objid) ) |
如果你的主键位置适当,创建外键就很不切实际了。你只要在参考表中创建合适的列并增加外键。在第二章开始时我们已经谈到,如果你在设计时需要,表中同样的列可以同在主键和外键中。
创建外键时,你还能够指定升级或删除父级表时做什么。通过默认,如果你想删除父级表中的记录,由于它会造成参考表中的行与行之间的孤立,所以删除操作就失败了。一个孤立的行就是存在于子级表中没有父级表与之对应的表。它能在数据模块中造成两个问题。在我们的employee 和vehicle表中,vehicle表中的NULL值表示vehicle没有和employee匹配。但是考虑到在表中保存了命令和命令的一些细节,这种情况下,命令细节表中孤立的记录就没有用。你就不知道那条命令是属于哪一行的。
你还可以选择其他的方法来避免删除失败。首先,你可以进行删除造作级联,就是说SQL Server将删除你想删除的所有子级行和父级行。采用该选项时,你千万要小心。如果你有一些关系并激活了级联删除,你就可以通过删除单个的记录删除很多数据。
第二个选项就是让SQL Server对参考表中的NULL值设置外键列。该选项创建了孤立的选项,这在前面也已经讨论过。第三,如果有的默认值的话,你可以让SQL Server设置外键列返回到列中的默认值中。如果要更新主键值本身的话,你还可以采用其他的选项。同样,SQL Server能够:(1)进行级联更新,这样子级行就指向正确的、带有新键的父级行;(2)将外键设置为NULL;或者(3),设置外键恢复其默认值。通常我们并不建议你改变主键的值,但是在很多情况下你会发现你需要这么做。如果你发现在那种情况下需要这么做,那就考虑在外键上设置更新规则。
约束
SQL Server包含一些加强数据完整性的约束条件。约束,就如同名字暗含的一样,常常用来约束添加到列中的值。我们已经讨论过SQL Server中的两种约束:主键和外键。主键约束数据,这样副本和NULL值就不会存在于列中。外键保证了添加的值存在于参考表中。你还能实施其他的约束保证数据完整性或加强事务规则。
唯一性约束
唯一性约束和主键约束一样,它们确保副本不在列或列集合中。它们在没有包含主键的列中进行配置。唯一性约束和主键之间的区别是什么呢?在技术角度来看,这二者之间唯一的不同就是唯一性主键允许你添加NULL值。但是由于这些值是唯一值,你只能在整个列中添加一个NULL值。我们说识别主键时,那是在说候选键。因为候选键还应该识别行,你应该在候选键上设置唯一性约束。增加唯一性约束和增加外键的方法一样,都是用类似以下的约束语句:
CONSTRAINT UNQ_vehicle_vin UNIQUE NONCLUSTERED (vin_number) |
检查约束
检查约束限制了逻辑表达式添加到列中的值。一个逻辑表达式就是任意一个能得出TRUE或FALSE值的SQL表达式。该表达式可以是任意有效的SQL表达式,从简单的比较到复杂的函数。例如,我们想限定添加到工资表中的值。我们用以下表达式对数据进行判断:
salary >= 10000 and salary <=150000 |
此行就否决了小于10000或大于150000的值。
每个列都包含多个检查约束,你或者还可以参考共有一个查询的多个列。在检查约束进行数据判断或评估时,它会允许评估结果正确的值。也就是说如果你的查询判断数据为NULL,那么该之就可以接受。因此如果你将NULL值添加到设计中,但是该检查约束返回的是未知的插入值。这项功能是设计好的,但是它也会导致一个始料未及的结果,所以我们要警惕。
ALTER TABLE dbo.Products ADD CONSTRAINT chk_non_negative_values CHECK ( weight >= 0 AND (shippingweight >= 0 AND shippingweight >= weight) AND height >= 0 AND width >= 0 AND depth >= 0 ) |
因为那些包含负数的列没有任何意义(重量和高度不能是负数),我们就增加了约束保证数据完整性。现在你想插入负数值时,SQL Server就会返回以下的错误并且拒绝插入数据。约束还防止了装货重量比实际重量要小。
The INSERT statement conflicted with the CHECK constraint "chk_non_negative_values" |
翻译
相关推荐
-
如何解决和避免SQL Server数据库死锁
学习如何避免SQL Server数据库死锁的第一步是做好准备工作。根据SQL Server专家的说法,了解死锁 […]
-
云端SQL Server高可用性最佳做法
与内部部署相比,在云端运行SQL Server可为数据库软件用户提供更多的灵活性和可扩展性,也可能更省钱。但云 […]
-
绘制数据关系图的利器:SQL Server 图像数据库工具
SQL Server 2017新增了图形数据库功能,你可以使用图结构来表示不同数据元素之间的关系。
-
如何在Azure部署时选择合适的SQL Server?
想要在Azure上运行SQL Server,企业一般会面临两种选择:在Azure虚拟机上安装SQL Server或使用Azure SQL Database。