河北工业大学数据库原理及应用实验实验报告(材料)_数据库原理及应用实验
河北工业大学数据库原理及应用实验实验报告(材料)由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“数据库原理及应用实验”。
《数据库原理及应用实验》
姓名:徐毅民学号: 153299
实验报告
班级:网络151 实验1数据库定义与操作语言实验
实验1.4数据更新实验
1、实验目的熟悉数据库的数据更新操作,能够使用SQL语句对数据库进行数据的插入、删除、修改操作。
2、实验内容和要求
针对TPC-H数据库设计数据单元组插入、批量数据插入、修改数据和删除数据等SQL语句。理解和掌握INSERTT、UPDATE、和DELETE语法结构的各个组成成分,结合嵌套SQL子查询,分别设计几种不同形式的插入、修改和删除数据的语句,并调试成功。
3、实验重点和难点
实验重点:插入、修改和删除数据的SQL 实验难点:与嵌套SQL子查询相结合的插入、修改和删除数据的SQL语句;利用一个表的数据来插入、修改和删除另一个表的数据。
4、实验报告示例
(1)INSERT基本语句(插入全部列的数据)插入一条顾客记录,要求每列都给一个合理的值。
INSERT INTO Customer VALUES(30,'张三','北京市',40,'010-51001199',0.00,'Northeast','VIP Customer');(2)INSERT基本语句(插入部分列的数据)插入一条订单记录,给出必要的几个字段值。
INSERT INTO Lineitem(orderkey,Linenumber,partkey,suppkey,quantity,shipdate)VALUES(862,ROUND(RANDOM()*100,0,479,1,10,'2012-3-6');/*RANDOM()函数为随机小数生成函数,ROUND()为四舍五入函数*/(3)批量数据INSERT语句
① 创建一个新的顾客表,把所有中国籍顾客插入到新的顾客表中。
INSERT INTO NewCustomer/*批量插入SELECT 语句查询结果到NewCustomer表中*/ SELECT C.* FROM Costomer C,Nation N WHERE C.nationkey=N.nationkey AND N.name='中国';②创建一个顾客购物统计表,记录每个顾客及其购物总数和总价等信息。
CREATE TABLE ShoppingStat(custkey INTEGER, quantity REAL, totalprice REAL);INSERT INTO ShoppingStat SELECT C.custkey,Sum(L.quantity),Sum(O.totalprice)FROM Customer C,Order O,Lineitem L WHERE C.custkey=O.custkey AND O.orderkey=L.orderkey GROUP BY C.custkey ③倍增零件表的数据,多次重复执行,直到总记录数达到50万为止。
INSERT INTO Part SELECT partkey+(SELECT COUNT(*)FROM Part), name,mfgr,brand,type,size,container,retailprice,comment FROM Part;(4)UPDATE语句(插入部分记录的部分列值)
“金仓集团”供应的所有零件的供应成本价下降10%。
UPDATE PartSupp SET supplycost=supplycost*0.9 WHERE suppkey=(SELECT suppkey
FROM Supplier WHERE name='金仓集团');(5)UPDATE语句(利用一个表中的数据修改另外一个表中的数据)
利用Part表中的零售价格来修改
Lineitem
中的extendedprice,其中
/*找出要修改的那些记录*/
/*对分组后的数据求总和*/ extendedprice=Part.retailprice*quantity。
UPDATE Lineitem L SET L.extendedprice=P.retailprice*L.quantity FROM Part P WHERE L.partkey=P.partkey;/*Lineitem表也可以直接与Part表相连接,而不需通过PartSupp连接*/(6)DELETE基本语句(删除给定条件的所有记录)
删除顾客张三的所有订单记录。
DELECT FROM Lineitem WHERE orderkey IN(SELECT orderkey
FROM Order O,Customer C
WHERE O.custkey=C.custkey AND C.name='张三');DELECT FROM Order WHERE custkey=(SELECT custkey FROM Customer WHERE name='张三');实验1.5 视图实验
1、实验目的熟悉SQL语言有关视图的操作,能够熟练使用SQL语句来创建需要的视图,定义数据库外模式,并能使用所创建的视图实现数据管理。
2、实验内容和要求
针对给定的数据库模式,以及相应的应用需求,创建视图和带WITH CHECK OPTION的视图,并验证视图WITH CHECK OPTION选项的有效性。理解和掌握视图消除执行原理,掌握可更新视图和不可更新视图的区别。
3、实验重点和难点 实验重点:创建视图。
实验难点:可更新的视图和不可更新的视图之区别,WITH CHECK OPTION的验证。
4、实验报告示例
(1)创建视图(省略视图列名)
创建一个“海大汽配”供应商供应的零件视图V_DLMU_PartSupp1,要求列出供应零件的编号、零件名称、可用数量、零售价格、供应价格和备注等信息。
CREATE VIEW V_DLMU_PARTSUPP1 AS /*由SELECT子句目标列组成视图属性*/
/*再删除张三的订单记录*/
/*先删除张三的订单明细记录*/ SELECT P.partkey,P.name,PS.availqty,P.retailprice,PS.supplycost,P.comment FROM Part P,PartSupp PS,Supplier S WHERE P.partkey=PS.partkey AND S.suppkey=PS.suppkey AND S.name='海大汽配';(2)创建视图(不能省略列名的情况)
创建一个视图V_CustAvgOrder,按顾客统计平均每个订单的购买金额和零件数量,要求输出 顾客编号、姓名,平均购买金额和平均购买零件数量。
CREATE VIEW V_CustAvgOrder(custkey,cname,avgprice,avgquantity)AS SELECT C.custkey,MAX(C.name),AVG(O.totalprice),AVG(L.quantity)FROM Customer C,Orders O,Lineitem L WHERE C.custkey=O.custkey AND L.orderkey=O.orderkey GROUP BY C.custkey;(3)创建视图(WITH CHECK OPTION)
使用WITH CHECK OPTION,创建一个“海大汽配”供应商供应的零件视图V_DLMU_PartSupp2,要求列出供应零件的编号、可用数量和供应价格等信息。然后通过该视图分别增加、删除和修改一条“海大汽配”零件供应记录,验证WITH CHECK OPTION是否起作用。
CREATE VIEW V_DLMU_PartSupp2 AS SELECT partkey,suppkey,availqty,supplycost FROM PartSupp WHERE suppkey=(SELECT suppkey FROM Supplier WHERE name='海大汽配')WITH CHECK OPTION;INSERT INTO V_DLMU_PartSupp2 VALUES(58889,5048,704,77760);UPADTE V_DLMU_PartSupp2 SET supplycost=12 WHERE suppkey=58889;DELETE FROM V_DLMU_PartSupp2 WHERE suppkey=58889;(4)可更新的视图(行列子集视图)
使用WITH CHECK OPTION,创建一个“海大汽配”供应商供应的零件视图V_DLMU_PartSupp4,要求列出供应零件的编号、可用数量和供应价格等信息。然后通过该视图分别增加、删除和修改一条“海大汽配”零件供应记录,验证该视图是否是可更新的,并比较上述“(3)创建视图”实验任务与本任务结果有何异同。
CREATE VIEW V_DLMU_PartSupp3 AS
SELECT partkey,suppkey,availqty,supplycost FROM PartSupp WHERE suppkey=(SELECT suppkey FROM Supplier WHERE name='海大汽配');
INSERT INTO V_DLUM_PartSupp3 VALUES(58889,5048,704,77760);
UPDATE V_DLMU_PartSupp3 SET supplycost=12 WHERE suppkey=58889;
DELETE FROM V_DLMU_PartSupp3 WHERE suppkey=58889;(5)可更新的视图
INSERT INTO V_CustAvgOrder VALUES(100000,NULL,20,2000);(6)删除视图(RESTRICT/CASCADE)
创建顾客订购零件明细视图V_CustOrd,要求列出顾客编号、姓名、购买零件数、金额,然后在该视图的基础上,在创建(2)的视图V_CustAvgOrder,然后使用RESTRICT选项和CASCADE选项删除视图V_CustOrd。
CREATE VIEW V_CustOrd(custkey,cname,qty,extprice)AS SELECT C.custkey,C.name,L.quantity,L.extendedprice FROM Customer C,Order O,Lineitem L WHERE C.custkey=O.custkey AND O.orderkey=L.orderkey;
CREATE VIEW V_CustAvgOrder(custkey,cname,avgqty,avgprice)AS SELECT custkey,MAX(cname),AVG(qty),AVG(extprice)FROM V_CustOrd GROUP BY custkey;
DROP VIEW V_CustOrd RESTRICT;
DROP VIEW V_CustOrd CASCADE;实验1.6 索引实验
1、实验目的掌握索引设计原则和技巧,能够创建合适的索引以提高数据库查询、统计分析效率。
2、实验内容和要求
针对给定的数据库模式和具体应用要求,创建唯一索引、函数索引、复合索引等;修改索引;删除索引。设计相应的SQL查询验证索引有效性。学习利用EXPLAIN命令分析SQL查询是否使用了所创建的索引,并能够分析其原因,执行SQL查询并估算索引提高查询效率的百分比。要求实验数据集达到10万条记录以上的数据量,以便验证索引效果。
3、实验重点和难点 实验重点:创建索引。
实验难点:设计SQL查询验证索引有效性。
4、实验报告示例
/*在视图V_CustOrd上再创建视图*/(1)创建唯一索引
在零件表的零件名称字段上创建唯一索引。
CREATE UNIQUE INDEX Idx_part_nameON Part(name);(3)创建复合索引(对两个及两个以上的属性创建索引,称为复合索引)
在零件表的制造商和品牌两个字段上创建一个复合索引。
CREATE UNIQUE INDEX Idx_part_mfgr_brand ON Part(mfgr,brand);(4)修改索引名称
修改零件表的名称字段上的索引名。
ALTER INDEX Idx_part_name_hash RENAME TO Idx_part_name_hash_new;(5)*验证索引效率
创建一个函数TestIndex,自动计算sql查询执行的时间。
CREATE FUNCTION TestIndex(p_part_name CHAR(55))RETURN INTEGER AS /*自定义函数TestIndex():输入参数为零件名称,返回SQL查询的执行时间*/ DECLARE begintime TIMESTAMP;endtime TIMESTAMP;durationtime INTEGER;BEGN SELECT CLOCK_TIMESTAMP()INTO begintime;/*记录查询执行的开始时间*/ PERFORM *FROM Part WHERE name=p_partname;/*执行SQL查询,不保存查询结果*/ SELECT CLOCK_TIMESTAMP()INTO endtime;SELECT DATEDIFF(„ms‟,begintime,endtime)INTO durationtime;
RETURN durationtime;
END;/*查看当零件表Part数据模型比较小,并且无索引时的执行时间*/ SELECT TestIndex(„零件名称‟);
INSERT INTO Part
/*不断倍增零件表的数据,直到50万条记录*/
/*计算并返回查询执行时间,时间单位为毫秒ms*/ SELECT partkey+(SELECT COUNT(*)FROM Part), Name,mfgr,brand,type,size,container,retailprice,comment FRPM Part;/*查看当零件表Part数据模型比较大,但无索引时的执行时间*/ SELECT TestIndex(„零件名称‟);
CREATE INDEX part_name ON Part(name);索引*/ /*查看零件表Part数据规模比较大,有索引时的执行时间*/ SELECT TestIndex();
/*在零件表的零件名称字段上创建
实验2 安全性语言实验
实验2.1
自主存取控制实验
1、实验目的掌握自主存取控制缺陷的定义和维护方法。
2、实验内容和要求
定义用户、角色,分配权限给用户、角色,回收权限,以相应的用户名登录数据库验证权限分配是否正确。选择一个应用场景,使用自主存取控制机制设置权限分配。可以采用两种方案。
方案一:采用SYSTEM超级用户登录数据库,完成所有权限分配工作,然后用相应用户名登录数据库已验证权限分配正确性;
方案二:采用SYSTEM用户登录数据库创建3个部门经理用户,并分配相应的权限,然后分别用3个经理用户名登录数据库,创建相应部门的USER、ROLE,并分配相应权限。
下面的实验报告示例采用了实验方案一。验证权限分配之前,请备份好数据库,针对不同的用户所具有的权限,分别设计相应的SQL语句加以验证。
3、实验重点和难点
实验重点:定义角色,分配权限和回收权限。实验难点:实验方案二实现权限的再分配和回收。
4、实验报告示例(1)创建用户为采购、销售和客户管理等3个部门的经理创建用户标识,要求具有创建用户或角色的○权利。
CREATE USER David WITH CREATEROLE PASSWORD '123456';CREATE USER Tom WITH CREATEROLE PASSWORD '123456';CREATE USER Kathy WITH CREATEROLE PASSWORD '123456';2为采购、销售和客户管理等3个部门的职员创建用户标识和用户口令。○CREATE USER Jeffery WITH PASSWORD '123456';CREATE USER Jane WITH PASSWORD '123456';CREATE USER Mike WITH PASSWORD '123456';(2)创建角色并分配权限
1为各个部门分别创建一个查询角色,并分配相应的查询权限。○CREATE ROLE PurchaseQueryRole;GRANT SELECT ON Part TO PurchaseQueryRole;GRANT SELECT ON Supplier TO PurchaseQueryRole;GRANT SELECT ON PartSupp TO PurchaseQueryRole;
CREATE ROLE SaleQueryRole;GRANT SELECT ON Order TO SaleQueryRole;GRANT SELECT ON Lineitem TO SaleQueryRole;
CREATE ROLE CustomerQueryRole;GRANT SELECT ON Customer TO CustomerQueryRole;GRANT SELECT ON Nation TO CustomerQueryRole;GRANT SELECT ON Region TO CustomerQueryRole;2为各个部门分别创建一个职员角色,对本部门信息具有查看、插入权限。○CREATE ROLE PurchaseEmployeeRole;GRANT SELECT,INSERT ON Part TO PurchaseEmployeeRole;GRANT SELECT,INSERT ON Supplier TO PurchaseEmployeeRole;GRANT SELECT,INSERT ON TABLE PartSupp TO PurchaseEmployeeRole;
CREATE ROLE SaleEmployeeRole;GRANT SELECT,INSERT ON Order TO SaleEmployeeRole;GRANT SELECT,INSERT ON Lineitem TO SaleEmployeeRole;
CREATE ROLE CustomerEmployeeRole;GRANT SELECT,INSERT ON Customer TO CustomerEmployeeRole;GRANT SELECT,INSERT ON Nation TO CustomerEmployeeRole;GRANT SELECT,INSERT ON Region TO CustomerEmployeeRole;3为各个部门创建一个经理角色,相应角色对本部门的信息具有完全控制权限,对其他部门○的信息具有查询权。经理有权给本部门资源分配权限。
CREATE ROLE PurchaseManagerRole WITH CREATEROLE; GRANT ALL ON Part TO PurchaseManagerRole; GRANT ALL ON Supplier TO PurchaseManagerRole; GRANT ALL ON PartSupp TO PurchaseManagerRole; GRANT SaleQueryRole TO PurchaseManagerRole; GRANT CustomerQueryRole TO PurchaseManagerRole;
CREATE ROLE SaleManagerRole WITH CREATEROLE; GRANT ALL ON Order TO SaleManagerRole GRANT ALL ON Lineitem TO SaleManagerRole GRANT SaleQueryRole TO SaleManagerRole GRANT PurchaseQueryRole TO SaleManagerRole
CREATE ROLE CustomerManagerRole WITH CREATEROLE; GRANT ALL ON Customer TO CustomerManagerRole GRANT ALL ON Nation TO CustomerManagerRole GRANT ALL ON Region TO CustomerManagerRole GRANT SaleQueryRole TO CustomerManagerRole GRANT PurchaseQueryRole TO CustomerManagerRole(3)给用户分配权限 1给部门经理分配权限。○GRANT PurchaseManagerRole TO David WITH ADMIN OPTION;GRANT SaleManagerRole TO Tom WITH ADMIN OPTION;GRANT CustomerManagerRole TO Kathy WITH ADMIN OPTION;2给各部门职员分配权限 ○GRANT PurchaseEmployeeRole TO Jeffery;GRANT SaleEmployeeRole TO Jane;GRANT CustomerEmployeeRole TO Mike;(4)回收角色或用户权限
1收回客户经理角色的销售信息查看权限。○REVOKE SaleQueryRole FROM CustomerManagerRole;2回收MIKE的客户部门职员权限。○REVOKE CustomerEmployeeRole FROM Mike;(5)验证权限分配正确性
1以David用户名登录数据库,验证采购部门经理的权限 ○SELECT * FROM Part;DELETE * FROM Order;2回收MIKE的客户部门职员权限 ○SELECT * FROM Customer;SELECT * FROM Part;实验2.2
审计实验
1、实验目的掌握数据库审计的设置和管理方法,以便监控数据库操作,维护数据库安全。
2、实验内容和要求
打开数据库审计开关。以具有审计权限的用户登录数据库,设置审计权限,然后以普通用户登录数据库,执行相应的数据操纵sql语句,验证相应审计设置是否生效,最后在一具有审计权限的用户登录数据库,查看是否存在相应的审计信息。
3、实验重点和难点
实验重点:数据库对象级审计,数据库语句级审计。
实验难点:合理地设置各种审计信息。一方面,为了保护系统重要的敏感数据,需要系统地设置各种审计信息,不能留有各种漏洞,以便随时监督系统使用情况,一旦出现问题也便于追查;另一方面,审计信息设置过多会严重影响数据库的使用性能,因此需要合理配置。
4、实验报告示例(1)审计开关
1显示当前审计开关状态 ○SHOW AUDIT_TRAIL;2打开审计开关 ○SET AUDIT_TRAIL TO ON;(2)数据库操作审计
1对客户信息表上的删除操作设置审计。○AUDIT DELETE ON Sales.Customer BY ACCESS;2以普通用户登录,执行sql语句。○DELETE Sales.Customer WHERE custkey=1011;3查看数据库对象审计信息,验证审计设置是否生效。○SELECT * FROM SYS_AUDIT_OBJECT;(3)语句级审计
1对表定义的更改语句ALTER设置审计 ○AUDIT ALTER TABLE BY ACCESS;2查看所有数据库所有语句级审计设置,验证审计设置是否生效 ○SELECT * FROM SYS_STMT_AUDIT_OPTS;3以普通用户登录,执行sql语句,验证审计设置是否生效 ○ALTER TABLE Customer ADD COLUMN tt INT;4查看所有审计信息 ○SELECT * FROM SYS_AUDIT_TRAIL;
四、实验心得
通过本次实验,知道了定义用户、角色,分配权限给用户、角色,回收权限,并以相应的用户名登陆数据库验证权限分配是否正确的方法。并且知道了数据库审计的目的和方法。做实验的同时,对sql语句有了更熟练的运用。
实验3 完整性语言实验
实验3.1 实体完整性实验
1、实验目的掌握实体完整性的定义和维护方法。
2、实验内容和要求
定义实体完整性,删除实体完整性。能够写出两种方式定义实体完整性的SQL语句:创建表时定义实体完整性、创建表后定义实体完整性。设计SQL语句验证完整性约束是否起作用。
3、实验重点和难点
实验重点:创建表时定义实体完整性。实验难点:有多个候选码时实体完整性的定义。
4、实验报告示例
(1)创建表时定义实体完整性(列级实体完整性)
定义供应商表的实体完整性。CREATE TABLE Supplier(suppkey INTEGER CONSTRAINT c1 PRIMARY KEY,name CHAR(25),addre VARCHAR(40),nationkey INTEGER,phone CHAR(15),acctbal REAL, comment VARCHAR(101));(2)创建表时定义实体完整性(表级实体完整性)
CREATE TABLE Supplier(suppkey INTEGER,name CHAR(25),addre VARCHAR(40),nationkey INTEGER,phone CHAR(15),acctbal REAL,comment VARCHAR(101),CONSTRAINT c1 PRIMARY KEY(suppkey));(3)创建表后定义实体完整性 定义供应商表。
CREATE TABLE Supplier(suppkey INTEGER,name CHAR(25),addre VARCHAR(40),nationkey INTEGER,phone CHAR(15),acctbal REAL,comment VARCHAR(101));ALTER TABLE Supplier ADD CONSTRAINT c1 PRIMARY KEY(suppkey);(4)定义实体完整性(主码由多个属性组成)定义供应关系表的实体完整性。
CREATE TABLE PartSupp(partkey INTEGER,suppkey INTEGER,availqty INTEGER,supplycost REAL,comment VARCHAR(199),PRIMARY KEY(partkey,suppkey));(5)有多个候选码时定义实体完整性
定义国家表的实体完整性,其中nationkey和name都是候选码,选择nationkey作为主码,name上定义唯一性约束。
CREATE TABLE nation(nationey INTEGER CONSTRAINT c1 PRIMARY KEY,name CHAR(25)UNIQUE,regionkey INTEGER,comment VARCHAR(152));(6)删除实体完整性
删除国家实体的主码。
ALTER TABLE nation DROP CONSTRAINT c1;
(7)增加两条相同记录,验证实体完整性是否起作用
/*插入两条主码相同的记录就会违反实体完整性约束*/ INSERT INTO Supplier(suppkey,name,addre,nationkey,phone,acctbal,comment)VALUES(11,‟test1‟,‟test1‟,‟101‟,‟12345678‟,0.0,‟test1‟);INSERT INTO Supplier(suppkey,name,addre,nationkey,phone,acctbal,comment)
VALUES(11,‟test2‟,‟test2‟,‟102‟,‟12345‟,0.0,‟test2‟);5.思考题
(1)所有列级完整性约束都可以改写成表级完整性约束,而表级完整性约束不一定能改写成列级完整性约束。请举例说明。
答:当主码由多个属性组成时,只能定义表级完整性约束。(2)什么情况下会违反实体完整性约束,DBMS将做何种违约处理?
答:1.主码值不唯一 2.主码的各个属性有空。
违约处理:拒绝执行、级联执行等操作。
实验3.2 参照完整性实验
1、实验目的掌握参照完整性的定义和维护方法。
2、实验内容和要求
定义参照完整性,定义参照完整性的违约处理,删除参照完整性。写出两种方式定义参照完整性的SQL语句:创建表时定义参照完整性、创建表后定义参照完整性。
3、实验重点和难点
实验重点:创建表时定义参照完整性。实验难点:参照完整性的违约处理定义。
4、实验报告示例
(1)创建表时定义参照完整性
先定义地区表的实体完整性,再定义国家表的参照完整性。
CREATE TABLE region(regionkey INTEGER PRIMARY KEY,name CHAR(25),comment VARCHAR(152));
CREATE TABLE nation(nationkey INTEGER PTIMARY KEY,name CHAR(25),regionkey INTEGER REFERENCES region(regionkey), /*列级参照完整性*/
comment VARCHAR(152));
或者:
CREATE TABLE nation(nationkey INTEGER PTIMARY KEY,name CHAR(25),regionkey INTEGER,comment VARCHAR(152),CONSTRAINT c1 FOREIGN KEY(regionkey)REFERENCES region(regionkey));
/*表级参照完整性*/(2)创建表后定义参照完整性
定义国家表的参照完整性。
CREATE TABLE nation(nationkey INTEGER PTIMARY KEY,name CHAR(25),regionkey INTEGER,comment VARCHAR(152));ALTER TABLE nation ADD CONSTRAINT c1 FOREIGN KEY(regionkey)REFERENCES region(regionkey);(3)定义参照完整性(外码由多个属性组成)定义订单项目表的参照完整性。
CREATE TABLE PartSupp(partkey INTEGER,suppkey INTEGER,availqty INTEGER,supplycost REAL,comment VARCHAR(199),PRIMARY KEY(partkey,suppkey));CREATE TABLE Lineitem(orderkey INTEGER REFERENCES Orders(orderkey),partkey INTEGER REFERENCES Part(partkey),suppkey INTEGER REFERENCES Supplier(suppkey),linenumber INTEGER,quantity REAL,PRIMARY KEY(orderkey,linenumber),FOREIGN KEY(partkey,suppkey)REFERENCES PartSupp(partkey,suppkey));(4)定义参照完整性的违约处理
定义国家表的参照完整性,当删除或修改被参照表记录时,设置参照表中相应记录的值为空。
CREATE TABLE nation(nationkey INTEGER PRIMARY KEY,name CHAR(25),regionkey INTEGER,comment VARCHAR(152), CONSTRAINT c1 FOREIGN KEY(regionkey)REFERENCES Region(regionkey)ON DELETE SET NULL ON UPDATE SET NULL);(5)删除参照完整性 删除国家表的外码。ALTER TABLE nation DROP CONSTRING c1;(6)插入一条国家记录,验证参照完整性是否起作用
/*插入一条国家记录,如果‘1001’号地区记录不存在,违反参照完整性约束*/ INSERT INTO nation(nationkey,name,regionkey,comment)VALUES(1001,‟nation1‟,1001,‟comment1‟);
实验3.3用户自定义完整性实验
1、实验目的掌握用户自定义完整性的定义和维护方法。
2、实验内容和要求
针对具体应用语义,选择NULL/NOT NULL、DEFAULT、UNIQUE、CHECK等,定义属性上的约束条件。
3、实验重点和难点
实验重点:NULL/NOT NULL、DEFAULT。实验难点:CHECK。
4、实验报告示例
(1)定义属性NULL/NOT NULL约束 定义地区表各属性的NULL/NOT NULL属性。CREATE TABLE region(regionkey INTEGER NOT NULL PRIMARY KEY,name CHAR(25)NOT NULL,comment VARCHAR(152)NULL);(2)定义属性DEFAULT约束
定义国家表的regionkey的缺省属性值为0值,表示其他地区。
CREATE TABLE nation(nationkey INTEGER PRIMARY KEY, name CHAR(25),regionkey INTEGER DEFAULT 0, comment VARCHAR(152), CONSTRAINT c1 FOREIGN KEY(regionkey)REFERENCES Region(region));(3)定义属性UNIQUE约束
定义国家表的名称属性必须唯一的完整性约束。CREATE TABLE nation(nationkey INTEGER PRIMARY KEY, name CHAR(25)UNIQUE, regionkey INTEGER, comment VARCHAR(152));(4)使用CHECK 使用CHECK定义订单项目表中某些属性应该满足的约束。CREATE TABLE Lineitem(orderkey INTEGER REFERENCES Orders(orderkey), partkey INTEGER REFERENCES Part(partkey), suppkey INTEGER REFERENCES Supplier(suppkey),linenumber INTEGER, quantity REAL, extendedprice REAL, discount REAL, tax REAL, returnflag CHAR(1), linestatus CHAR(1), shipdate DATE, commitdate DATE,receiptdate DATE, shipinstruct CHAR(25), shipmode CHAR(10), comment VARCHAR(44),PRIMARY KEY(orderkey,linenumber), FOREIGN KEY(partkey,suppkey)REFERENCES PartSupp(partkey,suppkey), CHECK(shipdate
/*装运日期
UPDATE sales.Lineitem
SET shipdate='2015-01-05',receiptdate='2015-01-01' WHERE orderkey=5005 AND linenumber=1;