实验八
一、实验内容
以SPJ数据库为例,完成以下要求 1、 定义S、P、J、SPJ实体完整性 2、 表间的参照完整性 3、 用户定义完整性
二、实验过程
1、 SQL定义各表
SQL:
CREATE DATABASE SPJ ON(NAME='SPJ_DATA', FILENAME='E:\\SPJ.mdf', SIZE=5MB, FILEGROWTH=10%) USE SPJ
CREATE TABLE S
(SNO CHAR(4) PRIMARY KEY, SNAME CHAR(20) UNIQUE,
STATUS INT CHECK (STATUS>=10 AND STATUS<=50), CITY CHAR (20) NOT NULL); CREATE TABLE P
(PNO CHAR(4) PRIMARY KEY, PNAME CHAR(20) NOT NULL, COLOR CHAR (10) NOT NULL, WEIGHT SMALLINT NOT NULL); CREATE TABLE J
(JNO CHAR(4) PRIMARY KEY, JNAME CHAR(20) UNIQUE, CITY CHAR(20) NOT NULL); CREATE TABLE SPJ (SNO CHAR(4), PNO CHAR(4), JNO CHAR(4), QTY INT NOT NULL,
PRIMARY KEY(SNO,PNO,JNO),
FOREIGN KEY(SNO) REFERENCES S(SNO), FOREIGN KEY (PNO) REFERENCES P(PNO),
FOREIGN KEY (JNO) REFERENCES J(JNO));
附表:S表
P表
SPJ表
J表
2、(举例,违反3类完整性)
2.1、违反实体完整性(记下出错提示) 1、主码值不唯一
在J表中插入如下数据时
INSERT INTO J
VALUES ('J1','三建','北京'); INSERT INTO J
VALUES ('J1','一汽','长春');
会出现提示错误:消息2627,级别14,状态1,第1 行
违反了PRIMARY KEY 约束'PK__J__0425A276'。不能在对象'dbo.J' 中插入重复键。 语句已终止。
2、主码属性值为空
在J表中插入以下数据时
INSERT INTO J
VALUES (null,'无线电厂','常州');
出现错误提示:
消息515,级别16,状态2,第1 行
不能将值NULL 插入列'JNO',表'SPJ.dbo.J';列不允许有空值。INSERT 失败。 语句已终止。
2.2、违反参照完整性(记下出错提示) 1.在参照表中插入元组 在SPJ表中插入如下数据 INSERT INTO SPJ
VALUES('S6','P1','J1','200'); 出现提示错误:
消息547,级别16,状态0,第1 行
INSERT 语句与FOREIGN KEY 约束\"FK__SPJ__SNO__1CF15040\"冲突。该冲突发生于数据库\"SPJ\",表\"dbo.S\。 语句已终止。
2.在参照表中修改外码值
在SPJ表中修改数据,输入如下SQL语句 UPDATE SPJ SET SNO='S6'
WHERE SNO='S1'; 出现提示错误:
消息547,级别16,状态0,第1 行
UPDATE 语句与FOREIGN KEY 约束\"FK__SPJ__SNO__1CF15040\"冲突。该冲突发生于数据库\"SPJ\",表\"dbo.S\。 语句已终止。
3.在被参照表中删除元组
在J表中删除元组,输入如下语句并执行 DELETE FROM J
WHERE JNO='J2'; 出现提示错误:
消息547,级别16,状态0,第1 行
DELETE 语句与REFERENCE 约束\"FK__SPJ__JNO__1ED998B2\"冲突。该冲突发生于数据库\"SPJ\",表\"dbo.SPJ\。 语句已终止。
4.在被参照表中修改外码值
在P表中修改数据,输入如下语句 UPDATE p SET PNO='P7'
WHERE PNO='P5'; 出现提示错误:
消息547,级别16,状态0,第1 行
UPDATE 语句与REFERENCE 约束\"FK__SPJ__PNO__1DE57479\"冲突。该冲突发生于数据库\"SPJ\",表\"dbo.SPJ\。 语句已终止。
2.3、违反用户定义完整性(记下出错提示)
1、违反列值非空
在J 表中插入以下数据时
INSERT INTO J1
VALUES ('J7','半导体厂',null);
出现错误提示:
消息515,级别16,状态2,第1 行
不能将值NULL 插入列'CITY',表'SPJ.dbo.J1';列不允许有空值。INSERT 失败。 语句已终止。
原因:在建表时已把列CITY定义为NOT NULL 2、违反列值唯一
在P表中插入如下数据时会出现以下提示错误
INSERT INTO J
VALUES ('J1','三建','北京'); INSERT INTO J
VALUES ('J2','三建','长春');
出现提示错误:
消息2627,级别14,状态1,第4 行
违反了UNIQUE KEY 约束'UQ__J__0519C6AF'。不能在对象'dbo.J' 中插入重复键。 语句已终止。
3.违反列值满足布尔表达式 在S表中插入如下数据
INSERT INTO S1
VALUES ('S1','精益','60','天津');
出现提示错误:消息547,级别16,状态0,第1 行
INSERT 语句与CHECK 约束\"CK__S1__STATUS__1CF15040\"冲突。该冲突发生于数据库\"SPJ\",表\"dbo.S1\。 语句已终止。
原因:列STATUS已定义为STATUS INT CHECK (STATUS>=10 AND STATUS<=50),取值不
能超过50.
三、遇到的问题 四、原因及解决方法
因篇幅问题不能全部显示,请点此查看更多更全内容