本次实验的目的是为了学习用户自定义约束,并实践用户完整性,利用短语NOT NULL,UNIQUE,CHECK保证用户定义完整性 。
用户自定义完整性原理解析:
用户完整性:
(1)域完整性是指数据库表中的列必须满足某种特定的数据类型或约束。域约束是最常见的用户定义完整性约束,当有新数据插入到数据库中,系统可以按照定义进行关系属性取值是否正确的检测。其中,约束又包括取值范围精度等规定,表中的CHECK FOREIGN KEY 约束和DEFAULT NOT NULL定义都属于域完整性的范畴。
(2)现在的RDBMS中,一般都有域完整性检查功能。SQL SERVER提供了定义和检验这类完整性的机制,以便用统一方法进行处理。而不是应用程序来承担这一功能。其他的完整性类型都支持用户定义的完整性。
(3)一个属性能否取空值一般由语义决定,也是域约束的内容之一。
以下是本次实验的练习与习题答案:(school表在此并未发出,请参考之前的练习)
USE SCHOOL --2.3.4实验练习 --(1)创建WORKER表,并自定义两个约束U1以及U2,其中U1规定NAME字段唯一,U2规定SAGE(级别)字段的上限是28。 CREATE TABLE WORKER ( NUMBER CHAR(5), NAME CHAR(8) CONSTRAINT U1 UNIQUE, SEX CHAR(1), SAGE INT CONSTRAINT U2 CHECK(SAGE<=28), DEAPARTMENT CHAR(20), CONSTRAINT PK_WORKER PRIMARY KEY(NUMBER) ) SELECT * FROM WORKER --(2)在WORKER表中插入一条合法记录。 INSERT INTO WORKER(NUMBER,NAME,SEX,SAGE,DEAPARTMENT) VALUES('00001','张三','M',20,'CS'); SELECT * FROM WORKER; --(3)演示插入违反U2约束的例子,U2规定元组的SAGE属性的值必须小于等于28. INSERT INTO WORKER(NUMBER,NAME,SEX,SAGE,DEAPARTMENT) VALUES('00002','李四','M',29,'CS'); INSERT INTO WORKER(NUMBER,NAME,SEX,SAGE,DEAPARTMENT) VALUES('00002','李四','M',28,'CS'); SELECT * FROM WORKER; --(4)去除U2约束。 ALTER TABLE WORKER DROP U2; --(5)重新插入(3)中想要插入的数据,由于去除了U2约束,所以插入成功。 INSERT INTO WORKER(NUMBER,NAME,SEX,SAGE,DEAPARTMENT) VALUES('00003','王四','M',29,'IS'); SELECT * FROM WORKER; --(6)创建规则RULE_SEX,规定插入或更新的值只能是M或F,并绑定到WORKER的SEX字段。 GO CREATE RULE RULE_SEX AS @VALUE IN ('F','M'); GO EXEC SP_BINDRULE RULE_SEX, 'WORKER.[SEX]'; --(7)演示违反规则RULE_SEX的插入操作。 INSERT INTO WORKER VALUES('00004','王浩','1','25','CS'); INSERT INTO WORKER VALUES('00004','王浩','F','25','CS'); SELECT * FROM WORKER;
--2.3.4自我实践 --(1)加入约束U3,令SAGE的值大于等于0. ALTER TABLE WORKER ADD CONSTRAINT U3 CHECK(SAGE>=0); --(2)加入规则R2,确保插入的记录的SAGE值在1到100之间,并绑定到SAGE属性上。 GO CREATE RULE R2 AS @VALUE BETWEEN 1 AND 100 GO EXEC SP_BINDRULE R2, 'WORKER.[SAGE]';