在“BookMessage”数据库中用SQL的DDL语句创建三张基表,关系模式如下 (下划线处为主键,两个斜体处为两个外键): 图书(图书编号、分类号、书名、作者、出版单位、单价) 读者(借书证号、姓名、单位、职称) 借阅(借书证号、图书编号、借阅日期、备注) 要求:定义实体完整性、参照完整性、用户定义的完整性(图书表的分类号不能为空值、读者表的姓名不能为空值、借阅表的借阅日期不能为空值)。
时间: 2025-04-18 20:16:41 浏览: 45
<think>嗯,用户想用SQL的DDL语句创建三张基表,分别是图书、读者和借阅。需要定义实体完整性、参照完整性和用户定义的完整性约束。首先,我得回忆一下这三种完整性分别对应什么约束。
实体完整性应该是指主键约束,确保每张表有唯一标识。比如图书表的主键可能是图书编号,读者表是读者ID,借阅表可能需要组合主键,比如图书编号和读者ID加上借阅日期?或者可能还有其他字段。需要确定每个表的主键。
参照完整性就是外键约束,比如借阅表中的图书编号应该引用图书表的图书编号,读者ID引用读者表的读者ID。这样保证数据的一致性,不会出现借阅记录中的书或读者不存在的情况。
用户定义的完整性可能包括非空约束、唯一约束、检查约束等。比如图书的出版日期不能为空,读者的联系方式必须唯一,或者图书的价格必须大于零之类的。需要根据实际需求来定。
接下来是具体设计每个表的字段。图书表可能需要图书编号(主键)、书名、作者、出版社、出版日期、价格等。读者表可能有读者ID(主键)、姓名、性别、联系方式、注册日期。借阅表需要记录借阅的图书、读者、借阅日期、归还日期,可能还有状态。
主键的话,借阅表可能需要组合主键,比如图书编号和借阅日期,或者单独一个借阅ID作为主键。不过通常借阅记录可能用单独的ID更方便,但用户可能希望用复合主键。需要确认,但根据问题描述,可能用户希望用复合主键,比如图书编号、读者ID和借阅日期一起作为主键,这样避免同一本书被同一读者同一天多次借阅?或者可能用自增ID更简单。但问题里没提到,可能按传统方式处理。
然后外键约束,借阅表的图书编号外键到图书表,读者ID外键到读者表。非空约束的话,比如图书编号、书名不能为空,读者ID、姓名不能为空,借阅表的各个字段也不能为空。用户定义的完整性比如性别只能是男或女,可以用检查约束;价格必须大于零;联系方式唯一等。
然后需要编写具体的DDL语句,使用CREATE TABLE,定义主键、外键、非空、检查约束等。注意不同数据库对检查约束的支持可能不同,比如MySQL在早期版本可能忽略检查约束,但现代版本支持。不过用户可能希望标准SQL写法。
可能需要检查各个字段的数据类型,比如ISBN可能用VARCHAR,价格用DECIMAL,日期用DATE。归还日期可能允许NULL,因为借阅时还未归还。借阅状态可以用检查约束限制为‘已借’或‘已还’之类的。
例如,图书表:
CREATE TABLE 图书 (
图书编号 VARCHAR(20) PRIMARY KEY,
书名 VARCHAR(100) NOT NULL,
作者 VARCHAR(50) NOT NULL,
出版社 VARCHAR(50),
出版日期 DATE NOT NULL,
价格 DECIMAL(10,2) CHECK (价格 > 0)
);
读者表:
CREATE TABLE 读者 (
读者ID VARCHAR(20) PRIMARY KEY,
姓名 VARCHAR(50) NOT NULL,
性别 CHAR(2) CHECK (性别 IN ('男', '女')),
联系方式 VARCHAR(50) UNIQUE,
注册日期 DATE NOT NULL
);
借阅表:
CREATE TABLE 借阅 (
图书编号 VARCHAR(20),
读者ID VARCHAR(20),
借阅日期 DATE NOT NULL,
归还日期 DATE,
状态 VARCHAR(10) CHECK (状态 IN ('已借', '已还')),
PRIMARY KEY (图书编号, 读者ID, 借阅日期),
FOREIGN KEY (图书编号) REFERENCES 图书(图书编号),
FOREIGN KEY (读者ID) REFERENCES 读者(读者ID)
);
这里借阅表的主键是复合主键,可能同一个读者多次借同一本书,但借阅日期不同。归还日期允许NULL,表示尚未归还。状态用检查约束限制。
需要确认是否主键的组合是否合理,是否有重复的可能。比如同一读者同一天借同一本书两次,可能不允许,所以用这三个字段作为主键可以避免重复。
另外,外键约束应该加上ON DELETE和ON UPDATE的规则,比如CASCADE或者NO ACTION。但问题里没有提到,可能默认处理即可。
用户可能还需要其他约束,比如借阅日期不能晚于当前日期,或者归还日期必须晚于借阅日期,这些可以用检查约束,但日期比较可能在SQL中处理,具体取决于数据库的支持。
总结下来,需要创建三张表,每张表的主键,外键关联,以及非空、唯一、检查等约束。然后写出正确的DDL语句,符合SQL标准,并注意语法正确性。</think>### 使用SQL DDL创建包含完整性约束的三张表
#### 1. **实体完整性(主键约束)**
- **`图书`表**:以`图书编号`为主键,确保每本书唯一标识
- **`读者`表**:以`读者ID`为主键,确保读者唯一性
- **`借阅`表**:以`图书编号+读者ID+借阅日期`为复合主键,防止重复借阅记录
#### 2. **参照完整性(外键约束)**
- **`借阅`表**中的`图书编号`引用`图书`表的主键
- **`借阅`表**中的`读者ID`引用`读者`表的主键
#### 3. **用户定义完整性**
- **非空约束**:关键字段如`书名`、`姓名`等禁止空值
- **检查约束**:`性别`限定为男/女,`价格`必须大于0,`状态`限定为已借/已还
- **唯一约束**:`联系方式`字段不允许重复
```sql
-- 创建图书表
CREATE TABLE 图书 (
图书编号 VARCHAR(20) PRIMARY KEY,
书名 VARCHAR(100) NOT NULL,
作者 VARCHAR(50) NOT NULL,
出版社 VARCHAR(50),
出版日期 DATE NOT NULL,
价格 DECIMAL(10,2) CHECK (价格 > 0)
);
-- 创建读者表
CREATE TABLE 读者 (
读者ID VARCHAR(20) PRIMARY KEY,
姓名 VARCHAR(50) NOT NULL,
性别 CHAR(2) CHECK (性别 IN ('男', '女')),
联系方式 VARCHAR(50) UNIQUE,
注册日期 DATE NOT NULL
);
-- 创建借阅表
CREATE TABLE 借阅 (
图书编号 VARCHAR(20),
读者ID VARCHAR(20),
借阅日期 DATE NOT NULL,
归还日期 DATE,
状态 VARCHAR(10) CHECK (状态 IN ('已借', '已还')),
PRIMARY KEY (图书编号, 读者ID, 借阅日期),
FOREIGN KEY (图书编号) REFERENCES 图书(图书编号),
FOREIGN KEY (读者ID) REFERENCES 读者(读者ID)
);
```
### 关键特性说明
1. **主键设计**:复合主键精确记录每次借阅行为[^3]
2. **级联操作**:默认外键约束下,若删除被引用的主键数据会触发错误,确保数据安全[^2]
3. **状态管理**:通过`CHECK`约束规范业务流程状态[^1]
阅读全文
相关推荐
















