面向SQL Server 2012的数据库约束的设计与应用
2018-01-17陈潇
陈潇
摘 要:在SQL Server 2012中,当管理员完成数据库及表的建立后,后期对表中数据进行插入、修改、删除等操作时由于操作不当,很可能会导致不符合规范的数据进入数据库。为避免这种情况发生,数据库表建立完毕后应通过数据完整性来保证存储的数据正确、有效、相容。约束是实现数据完整性的有效手段之一,本文介绍不同类型数据完整性的含义及实现手段,并结合具体的应用场景创建相关约束。
关键词:SQL Server;约束;数据完整性
中图分类号:TP392 文献标识码:A
Abstract:In SQL Server 2012,after the database and the tables are set up,some abnormal data may enter the database caused by administrators' improper operations of inserting,modifying,deleting,etc.In order to avoid this situation,data integrity should be used to ensure the correctness,validness and compatibility of the stored data after setting up the database and the tables.Constraint is one of the effective means to achieve data integrity.This article describes the meaning and implementation of different types of data integrity,and creates related constraints in combination with specific application scenarios.
Keywords:SQL Server 2012;constraint;data integrity
1 引言(Introduction)
当管理员完成数据库及表的建立后,后期对数据进行插入、修改、删除等作时由于操作不当,很可能会导致止不符合规范的数据进入数据库。为了保证存储数据的正确,SQL Server中提出了数据完整性这一概念,是指数据库中存储数据的正确、有效和相容[1]。
SQL Server 2012中的数据完整性可以分为:实体完整性、域完整性和参照完整性和用户自定义完整性。数据库采用多种方法来保证数据完整性,包括外键、约束、规则和触发器,本文探讨使用约束作为手段实现数据完整性。
约束是实现数据完整性的有效手段,是一组完整性规则的集合。约束包括主键(PRIMARY KEY)约束、唯一键(UNIQUE)约束、检查(CHECK)约束、默认值(DEFAULT)约束、外键约束和级联参照完整性约束。
2 实体完整性(Entity integrity)
实体完整性要求每一个表中的主键字段都不能为空或者重复的值。主要通过对表设置主键约束、唯一键约束来实现[2]。
2.1 主键约束
主键约束要求设置约束列不允许出现重复值,一般在设计表时通过对列设置主键来实现。使用T-SQL语句建立主键的格式如下:
Alter Table 表名
Add Constraint 約束名 Primary Key(列名)
比如:设置表UserInfo的UserId列为主键约束。
Alter Table UserInfo
Add Constraint IX_UserInfo Primary Key(UserId)
2.2 唯一键约束
与主键约束一样,唯一键约束也可以保证列中数据的唯一性。与主键约束不同的是唯一键约束可以有多个,并且设置唯一键约束的列中可以有空值,但只能有一个空值(NULL)。
使用T-SQL语句建立唯一键约束的格式如下:
Alter Table 表名
Add Constraint 约束名 UNIQUE(列名)
数据库管理员在建立数据表时一般会指定主键列,一张表只能存在一个主键约束。因此如果要求表中某一字段的取值不能出现重复值,则可以通过唯一键约束来实现。如用户信息表中,已将‘用户Id字段设置为主键,为了保证数据的唯一性,可以将‘电话号码‘身份证号码等要求唯一取值的字段设置为唯一键约束。
比如,将会员信息表(userInfo)的用户移动电话(userMobile)列设置为唯一键约束。
Alter table userInfo
Add Constraint IX_userMobile UNIQUE(userMobile)
设置唯一键约束后,向‘userMobile列中输入重复的电话号码,提示如图1所示的错误。
3 域完整性(Domain integrity)
域完整性是针对关系数据库的约束条件,域完整性限制了某些属性中出现的值,把属性限制在一个有限的集合中,它保证表字段中不能输入无效的值,即输入值的范围只能在规定的集合内[3]。在SQL Server中实现域完整性主要通过检查约束(CHECK)实现和默认值约束(DEFAULT)。
检查约束通过限制可输入或修改的一列或多列的值来强制实现域完整性[4],它作用于插入(INSERT)和修改(UPDATE)语句,语法格式如下。
Alter Table 表名
Add Constraint 约束名 CHECK (检查表达式)
例如:将会员信息表(userInfo)的用户移动电话(userMobile)列限制为13位数字,且首位数字不能为‘0。
Alter Table userInfo
Add Constraint CK_mobileCHECK (userMobile like‘[1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])
在默认情况下,检查(CHECK)约束同时作用于新数据和表中已有的老数据,有些情况下,表字段中现有的记录与必须遵从的特定业务相冲突,但取值没有错误,例如,过去可能要求邮政编码必须是五位数字,但现在却需要新数据为九位邮政编码。包含五位邮政编码的旧数据将与包含九位邮政编码的新数据共存。可以在通过关键字WITH NOCHECK禁止检查表中已有的数据。语法格式如下:
Alter Table 表名
Withnocheck Add Constraint 约束名 CHECK (检查表达式)
4 参照完整性(Referential integrity)
在关系数据库中,表之间是通过主键和外键存在联系的,两张具有联系的表分为父表(主键列所在表)和子表(外键列所在表)。在数据表具体操作中经常遇到以下情况,当我们对表中的数据进行插入、修改和删除时,很容易出现父表、子表中相关记录不匹配的现象[5]。
比如,将会员信息表(userInfo)中的用户姓名(userName)进行更改,如果与之相关的表中的用户姓名不做更改,则会出现记录不匹配的现象。再比如,如果在会员信息表(userInfo)中将一个会员删除,那么与之相关的表,如订单信息表(orderInfo)中该用户的相关记录应该一起删除。
参照完整性的目的是为了保证数据库相关表之间记录的一致性,涉及关系(表)之间的相互引用。要求关系中不允许引用不存在的实体,当插入、更新、删除表中的记录时,通过参照引用相互关联的另一个表中的相应记录,来检查对表的操作是否符合要求。主要通过外键(FOREIGN KEY)约束和级联参照完整性约束来实现。
4.1 外键约束
外键(FOREIGN KEY)约束是为了强制实现表之间的参照完整性。定义了一个关系数据库中,不同的表中列之间的关系(父键与外键)。要求一个表中(子表)的一列或一组列的值必须与另一个表(父表)中的相关一列或一组列的值相匹配[6]。外键约束不允许为空值,但是,如果组合外键的某列含有空值,则将跳过该外键约束的检验,格式如下。
Alter Table 表名
Add Constraint 关系名 FOREIGN KEY (外键列) REFERENCES 主键表(主键列)
比如,设置用户信息表‘userinfo中的用户编号列‘userid与订单信息表‘orderInfo的用户编号列‘userid列设置外键约束。语句格式如下:
Alter Table orderInfo
Add Constraint FK_FOREIGN FOREIGN KEY (userid) references userinfo(userid)
为两表之间设置外键约束后,要求子表(orderinfo)中的‘userid列的取值必须与父表(userinfo)表中的‘userid列的取值匹配。如不匹配,比如输入一个主表中没有的数据(如:userId为16),则数据输入完毕后提示无法更新,如图2所示。
4.2 级联参照完整性约束
级联参照完整性约束是为了保证外键数据的关联性。当在父表中更新或删除外键引用的键记录时,则同时在子表中更新或删除引用它的外键记录,为了防止孤立外键的产生[7]。使用语句设置外键约束的格式如下。级联参照完整性分为更新级联约束和删除级联约束两种。语法格式如下:
Alter Table 表名
Add Constraint 关系名 FOREIGN KEY (外键列) REFERENCES 引用表名(引用列) ON DELETE|UPDATE CASCADE
其中,ON DELETE CASCADE和ON UPDATE CASCADE分別表示带更新级联的外检约束和带删除级联的外键约束。
例如,设置会员信息表‘usrInfo和订单信息表‘orderInfo之间的关系,实现当父表(usrInfo)中的列‘userId更新数据时,子表(orderInfo)中相关列(userId)能一起更新。
Alter table orderInfo
Add constraint FK_会员信息_订单信息FOREIGN KEY (userId) REFERENCES userInfo(userId) ON UPDATE CASCADE
约束设置完毕后,更新父表中的主键列数据(如将userid为‘3的记录更改为‘103),则子表中相关列随之一起更改。如图3和图4所示。
同理,使用ON DELETTE CASCADE子句可以实现父表中删除记录后,子表相关记录会随之删除。
5 结论(Conclusion)
SQLServer中约束定义关于列中允许值的规则,是强制完整性的标准机制。使用约束优先于使用触发器、规则和默认值[8]。数据库管理者可根据数据完整性的不同级别合理使用约束,避免数据库中出现无效数据,从而实现数据存储的合理性和正确性。
参考文献(References)
[1] 潘林森,姚渝春.SQL Server数据库系统中的数据完整性控制方法[J].重庆师范大学学报(自然科学版),2004(02):35-38.
[2] 赫然,王秀坤,王轶讴,等.分布式数据库中海量数据采集完整性约束[J].大连理工大学学报,2013(S1):190-192.
[3] 赵洁.信息系统开发中的数据库完整性维护技术[J].信息技术,2013(07):137-139.
[4] 陈洁,薛恒威.SQL Server数据库中数据完整性的分析与实践[J].河北软件职业技术学院学报,2018(01):4-6.
[5] 陈增祥.SQL Server数据库数据完整性的研究与分析[J].信息安全与技术,2012(01):32-34.
[6] 王洪香.基于SQL Server数据库完整性约束的几点探讨[J].办公自动化,2006(15):25-27.
[7] 任靖.浅析数据库触发器和约束之优先级及兼容性[J].电子制作,2013(3):62.
[8] 王哲.数据库中完整性约束的教学方法探究[J].中国科教创新刊,2013(35):164-166.
作者简介:
陈 潇(1983-),男,硕士,讲师.研究领域:数据库管理与应用,管理信息系统开发.