Initial commit

This commit is contained in:
2025-11-06 09:53:12 +08:00
commit ea8d38c146
50 changed files with 1200 additions and 0 deletions

79
Experiment3/Exp3-1.sql Normal file
View File

@@ -0,0 +1,79 @@
Use TPCH;
Go
-- (1) 创建表时定义实体完整性(列级实体完整性)
-- 定义供应商表的实体完整性。
CREATE TABLE Sales_Exp3.Supplier(
suppkey INT CONSTRAINT PK_Supplier PRIMARY KEY,
name CHAR(25),
address VARCHAR(40),
nationkey INT,
phone CHAR(15),
acctbal REAL,
comment VARCHAR(101)
);
Go
DROP TABLE Sales_Exp3.Supplier;
Go
-- (2) 创建表时定义实体完整性(表级实体完整性)
-- 定义供应商表的实体完整性。
CREATE TABLE Sales_Exp3.Supplier (
suppkey INT,
name CHAR(25),
address VARCHAR(40),
nationkey INT,
phone CHAR(15),
acctbal REAL,
comment VARCHAR(101),
CONSTRAINT PK_Supplier PRIMARY KEY (suppkey)
);
Go
DROP TABLE Sales_Exp3.Supplier;
Go
-- (3) 创建表后定义实体完整性
-- 定义供应商表。
CREATE TABLE Sales_Exp3.Supplier (
suppkey INT NOT NULL,
name CHAR(25),
address VARCHAR(40),
nationkey INT,
phone CHAR(15),
acctbal REAL,
comment VARCHAR(101)
);
ALTER TABLE Sales_Exp3.Supplier /* 再修改供应商表,增加实体完整性 */
ADD CONSTRAINT PK_Supplier PRIMARY KEY (suppkey);
Go
-- (4) 定义实体完整性(主码由多个属性组成)
-- 定义供应关系表的实体完整性。
CREATE TABLE Sales_Exp3.PartSupp (
partkey INT,
suppkey INT,
availqty INT,
supplycost REAL,
comment VARCHAR(199),
PRIMARY KEY (partkey, suppkey)
);
/* 主码由多个属性组成,实体完整性必须定义在表级 */
Go
-- (5) 有多个候选码时定义实体完整性
-- 定义国家表的实体完整性其中nationkey和name都是候选码选择nationkey作为主码name上定义唯一性约束。
CREATE TABLE Sales_Exp3.nation (
nationkey INT CONSTRAINT PK_Nation PRIMARY KEY,
name CHAR(25) UNIQUE,
regionkey INT,
comment VARCHAR(152)
);
Go
-- (6) 删除实体完整性
-- 删除国家实体的主码。
ALTER TABLE Sales_Exp3.nation
DROP CONSTRAINT PK_Nation;
Go
-- (7) 增加两条相同记录,验证实体完整性是否起作用
/* 插入两条主码相同的记录就会违反实体完整性约束 */
INSERT INTO Sales_Exp3.Supplier (suppkey, name, address, nationkey, phone, acctbal, comment)
VALUES (11, 'test1', 'test1_addr', 101, '12345678', 0.0, 'test1_comment');
INSERT INTO Sales_Exp3.Supplier (suppkey, name, address, nationkey, phone, acctbal, comment)
VALUES (11, 'test2', 'test2_addr', 102, '23456789', 0.0, 'test2_comment');
Go
/* [23000][2627] 行 5: 违反了 PRIMARY KEY 约束“PK_Supplier”。不能在对象“Sales_Exp3.Supplier”中插入重复键。重复键值为 (11)。 */

105
Experiment3/Exp3-2.sql Normal file
View File

@@ -0,0 +1,105 @@
Use TPCH;
Go
-- (1) 创建表时定义参照完整性
-- 先定义地区表的实体完整性,再定义国家表上的参照完整性。
CREATE TABLE Sales_Exp3.region (
regionkey INT PRIMARY KEY,
name CHAR(25),
comment VARCHAR(152)
);
CREATE TABLE Sales_Exp3.nation (
nationkey INT PRIMARY KEY,
name CHAR(25),
regionkey INT REFERENCES Sales_Exp3.region(regionkey), /* 列级参照完整性 */
comment VARCHAR(152)
);
-- OR
DROP TABLE Sales_Exp3.nation;
CREATE TABLE Sales_Exp3.nation (
nationkey INT PRIMARY KEY,
name CHAR(25),
regionkey INT,
comment VARCHAR(152),
CONSTRAINT FK_Nation_Region FOREIGN KEY (regionkey) REFERENCES Sales_Exp3.region(regionkey) /* 表级参照完整性 */
);
Go
DROP TABLE Sales_Exp3.nation;
Go
-- (2) 创建表后定义参照完整性
-- 定义国家表的参照完整性。
CREATE TABLE Sales_Exp3.nation (
nationkey INT PRIMARY KEY,
name CHAR(25),
regionkey INT,
comment VARCHAR(152)
);
ALTER TABLE Sales_Exp3.nation
ADD CONSTRAINT FK_Nation_Region FOREIGN KEY (regionkey) REFERENCES Sales_Exp3.region(regionkey);
Go
-- (3) 定义参照完整性(外码由多个属性组成)
-- 定义订单项目表的参照完整性。
CREATE TABLE Sales_Exp3.Supplier(suppkey INT PRIMARY KEY, name CHAR(25));
CREATE TABLE Sales_Exp3.Part(partkey INT PRIMARY KEY, name VARCHAR(55));
CREATE TABLE Sales_Exp3.Orders(orderkey INT PRIMARY KEY, orderdate DATE);
Go
CREATE TABLE Sales_Exp3.PartSupp (
partkey INT,
suppkey INT,
availqty INT,
supplycost REAL,
comment VARCHAR(199),
PRIMARY KEY (partkey, suppkey)
);
CREATE TABLE Sales_Exp3.Lineitem (
orderkey INT REFERENCES Sales_Exp3.Orders(orderkey),
partkey INT REFERENCES Sales_Exp3.Part(partkey),
suppkey INT REFERENCES Sales_Exp3.Supplier(suppkey),
linenumber INT,
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 Sales_Exp3.PartSupp(partkey, suppkey)
);
Go
DROP TABLE Sales_Exp3.nation;
Go
-- (4) 定义参照完整性的违约处理
-- 定义国家表的参照完整性,当删除或修改被参照表记录时,设置参照表中相应记录的值为空值。
CREATE TABLE Sales_Exp3.nation (
nationkey INT PRIMARY KEY,
name CHAR(25),
regionkey INT NULL,
comment VARCHAR(152),
CONSTRAINT FK_Nation_regionkey
FOREIGN KEY (regionkey) REFERENCES Sales_Exp3.region(regionkey)
ON DELETE SET NULL
ON UPDATE SET NULL
);
Go
-- (5) 删除参照完整性
-- 删除国家表的外码
ALTER TABLE Sales_Exp3.nation
DROP CONSTRAINT FK_Nation_regionkey;
Go
-- (6) 插入一条国家记录,验证参照完整性是否起作用
/* 插入一条国家记录,如果'1001'号地区记录不存在,违反参照完整性约束。 */
ALTER TABLE Sales_Exp3.nation
ADD CONSTRAINT PK_Nation_regionkey
FOREIGN KEY (regionkey) REFERENCES Sales_Exp3.region(regionkey)
ON DELETE SET NULL
ON UPDATE SET NULL;
Go
INSERT INTO Sales_Exp3.nation (nationkey, name, regionkey, comment)
VALUES (1001, 'nation1', 1001, 'comment1');
Go
/* [23000][547] 行 1: INSERT 语句与 FOREIGN KEY 约束"PK_Nation_regionkey"冲突。该冲突发生于数据库"TPCH",表"Sales_Exp3.region", column 'regionkey'。 */

2
Experiment3/Exp3-3.sql Normal file
View File

@@ -0,0 +1,2 @@
Use TPCH;
Go