当前位置:文档之家› 数据库系统概论实验

数据库系统概论实验

10软件1班22号周超
实验八
一、实验内容
以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
V ALUES('S6','P1','J1','200');
出现提示错误:
消息547,级别16,状态0,第1 行
INSERT 语句与FOREIGN KEY 约束"FK__SPJ__SNO__1CF15040"冲突。

该冲突发生于数据库"SPJ",表"dbo.S", column 'SNO'。

语句已终止。

2.在参照表中修改外码值
在SPJ表中修改数据,输入如下SQL语句
UPDATE SPJ
SET SNO='S6'
WHERE SNO='S1';
出现提示错误:
消息547,级别16,状态0,第1 行
UPDA TE 语句与FOREIGN KEY 约束"FK__SPJ__SNO__1CF15040"冲突。

该冲突发生于数据库"SPJ",表"dbo.S", column 'SNO'。

语句已终止。

3.在被参照表中删除元组
在J表中删除元组,输入如下语句并执行
DELETE
FROM J
WHERE JNO='J2';
出现提示错误:
消息547,级别16,状态0,第1 行
DELETE 语句与REFERENCE 约束"FK__SPJ__JNO__1ED998B2"冲突。

该冲突发生于数据库"SPJ",表"dbo.SPJ", column 'JNO'。

语句已终止。

4.在被参照表中修改外码值
在P表中修改数据,输入如下语句
UPDATE p
SET PNO='P7'
WHERE PNO='P5';
出现提示错误:
消息547,级别16,状态0,第1 行
UPDA TE 语句与REFERENCE 约束"FK__SPJ__PNO__1DE57479"冲突。

该冲突发生于数据库"SPJ",表"dbo.SPJ", column 'PNO'。

语句已终止。

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", column 'STATUS'。

语句已终止。

原因:列STATUS已定义为STATUS INT CHECK(STATUS>=10 AND STATUS<=50),取值不能超过50.
三、遇到的问题
四、原因及解决方法。

相关主题