表管理(约束)实验
设计性实验
1.创建学生数据库STU6065,并在其中创建表:
--1.创建学生数据库 STU6065
CREATE DATABASE STU6065--2.创建表
--学生表
CREATE TABLE Student6065(Sno CHAR(6) PRIMARY KEY CHECK (Sno LIKE '[1-9][0-9][0-9][0-9][0-9][0-9]'),--主键Sname VARCHAR(40) UNIQUE,Ssex CHAR(2) CHECK (Ssex IN ('男', '女')),Sage INT CHECK (Sage > 0),Sdept VARCHAR(20) CHECK (Sdept IN ('计算机', '软件', '网络', '信息'))
);
--课程表
CREATE TABLE Course6065(Cno CHAR(4) PRIMARY KEY CHECK (Cno LIKE '[1-9][0-9][0-9][0-9]'),Cname VARCHAR(40) NOT NULL,Cpno CHAR(4),Ccredit SMALLINT DEFAULT 2,FOREIGN KEY (Cpno) REFERENCES Course6065(Cno)
);
--学生选课表
CREATE TABLE SC6065(Sno CHAR(6),Cno CHAR(4),Pscj DECIMAL(3,1) DEFAULT 0 CHECK (Pscj BETWEEN 0 AND 100),Qkcj DECIMAL(3,1) DEFAULT 0 CHECK (Qkcj BETWEEN 0 AND 100),Zpcj AS (0.3 * Pscj + 0.7 * Qkcj),PRIMARY KEY (Sno, Cno),FOREIGN KEY (Sno) REFERENCES Student6065(Sno) ON UPDATE CASCADE ON DELETE CASCADE,FOREIGN KEY (Cno) REFERENCES Course6065(Cno) ON UPDATE NO ACTION ON DELETE NO ACTION
);EXEC sp_helpconstraint 'Course6065';
EXEC sp_helpconstraint 'SC6065';
2. 修改表
1)删除Course6065表的主键Cno,然后再添加主键Cno。
2)删除Course6065表的外键Cpno,然后再添加外键Cpno。
-- 删除主键约束
ALTER TABLE SC6065
DROP CONSTRAINT [FK__SC6065__Cno__62AFA012];
ALTER TABLE SC6065
DROP CONSTRAINT [FK__SC6065__Sno__61BB7BD9];
ALTER TABLE Course6065
DROP CONSTRAINT [FK__Course6065__Cpno__5B0E7E4A];
ALTER TABLE Course6065
DROP CONSTRAINT [PK__Course60__C1FE637319D13F8E];-- 重新添加主键约束
ALTER TABLE Course6065
ADD CONSTRAINT PK_Course6065_Cno PRIMARY KEY (Cno);
-- 重新添加 SC6065 表的外键约束
ALTER TABLE SC6065
ADD CONSTRAINT FK_SC6065_Cno FOREIGN KEY (Cno) REFERENCES Course6065(Cno);ALTER TABLE SC6065
ADD CONSTRAINT FK_SC6065_Sno FOREIGN KEY (Sno) REFERENCES Student6065(Sno) ON UPDATE CASCADE ON DELETE CASCADE;-- 重新添加 Course6065 表的外键约束
ALTER TABLE Course6065
ADD CONSTRAINT FK_Course6065_Cpno FOREIGN KEY (Cpno) REFERENCES Course6065(Cno);
3)修改表Student6065,把Sname设为主键,同时保持sc6065的外键sno Student6065.Sno.
首先,在修改Student6065表的主键之前,需要先删除SC6065表中引用Student6065表的外键约束
ALTER TABLE SC6065
DROP CONSTRAINT [FK_SC6065_Sno];
接着,我需要删除Student6065表的现有主键约束
ALTER TABLE Student6065
DROP CONSTRAINT [PK__Student6__CA1FE464664404FB];
然后,添加Student6065表的Sname列设为主键
ALTER TABLE Student6065
ADD CONSTRAINT PK_Student6065_Sname PRIMARY KEY (Sname);
接着,添加唯一约束
ALTER TABLE Student6065
ADD CONSTRAINT UQ_Student6065_Sno UNIQUE (Sno);
最后,重新添加SC6065表的外键约束,引用Student6065表的Sno列
ALTER TABLE SC6065
ADD CONSTRAINT FK_SC6065_Sno FOREIGN KEY (Sno) REFERENCES Student6065(Sno) ON UPDATE CASCADE ON DELETE CASCADE;
以下照片内容验证了主键和唯一约束的功能
(该题有点麻烦,要写出详细的每步过程。)
3.创建临时表
(1)局部临时表
-- 创建局部临时表
CREATE TABLE #t065 (id INT IDENTITY(1,1), -- 自增长列C NVARCHAR(100) -- 类型自定,这里使用 NVARCHAR(100) 作为示例
);
-- 尝试添加数据
INSERT INTO #t065 (C) VALUES ('11111');
(2)全局临时表(选择适当类型)
-- 创建全局临时表
CREATE TABLE ##t065 (A UNIQUEIDENTIFIER DEFAULT NEWID(), -- 主键,默认值是 NEWID()B TIMESTAMP
);
-- 尝试添加数据
INSERT INTO ##t065 DEFAULT VALUES;(3)比较两个临时表应用范围
局部临时表 (#txxx): 只能在创建它的会话中访问,会话结束时表自动删除。
全局临时表 (##txxx): 可以在多个会话中访问,但最后一个会话结束时表自动删除。
实验小结(实验中遇到的问题及解决过程、实验中产生的错误及原因分析、实验体会和收获)
这次的作业真的是有史以来耗时最久的一次,大量的时间都花在了设计性实验修改表的部分,在修改表的第一和第二小题中,我出现了比较多的错误,像什么主键约束,外键约束,我刚开始都没能正确找到所要处理的主键和外键内容,导致经常执行后出现什么约束不存在,约束名称不正确,表中没有定义任何约束等问题,在这里我真的试错了很多次,慢慢地我学会了仔细查看对应表中的约束,还有就是表与表之间也存在着主键外键的约束,这也是比较容易出错的地方,但是还好在花费了一个多小时后我终于处理完了修改表中的第一第二小问。
但是修改表中的第三小问,我至今也没有特别清晰地弄明白,感觉还是有很多地方没有处理清楚,就像要找出Sname这一列,但是好几次我没有查看到这一列,但是当我尝试着重新添加时有显示Sname这列已经被多次定义了,所以我对此表示很奇怪,但是确实也是还没找到一个比较清晰的解决方法和错误原因。还有就是出现了我尝试删除的主键约束被另一个表的外键约束引用,导致我无法删除,因为SQL Server 不允许直接删除被外键引用的主键约束,除非先删除或禁用相关的外键约束。所以在这里我也花了很多时间,但是确实也没有很明白该怎么处理。
以上,我感觉这次实验确实相比之前有难度了,很多东西慢慢开始需要耗费大量时间才可以弄明白了,希望在以后的实验中可以学到更多吧。