满足文档中的要求,为每个表添加指定类型的约束(主键约束、唯一约束、外键约束、检查约束以及空值约束),补充完剩下的代码。
时间: 2024-09-30 08:05:46 浏览: 50
SQL中的几种约束语句
基于提供的文档内容,以下是针对各个表补充添加各种约束(主键约束、唯一约束、外键约束、检查约束及空值约束)后的完整SQL脚本:
### DEPTEXPM 表
此表已经定义了主键 `DEPTNO` 和非空约束,因此只需增加其他类型的约束。考虑到该表的实际需求,我们可以增加如下的检查约束以限制部门名称不为空:
```sql
ALTER TABLE DEPTEXPM
ADD CONSTRAINT CHK_DEPTNAME CHECK (DEPTNAME IS NOT NULL);
```
### EMPLEXPM 表
对于 `EMPLXPM` 表,我们除了已经有的主键之外,可以为其添加如下几种约束:
- 唯一性约束:保证员工号的唯一性(虽然已经在主键中体现,但这里假设是为了展示如何添加)
- 外键约束:关联到 `DEPTEXPM` 表来表示所属部门
- 检查约束:例如,性别字段只能是 '男' 或 '女'
- 允许空值约束:允许某些字段为空,比如 `NATIVE1` 可能存在未知的情况
```sql
ALTER TABLE EMPLEXPM
ADD CONSTRAINT UQ_EMPLNO UNIQUE (EMPLNO),
ADD CONSTRAINT FK_DEPTNO FOREIGN KEY(DEPTNO) REFERENCES DEPTEXPM(DEPTNO),
ADD CONSTRAINT CHK_SEX CHECK (SEX IN ('男', '女')),
ADD CONSTRAINT CHK_NULL_NATIVE1 CHECK (NATIVE1 IS NULL OR LENGTH(NATIVE1) > 0);
```
注意:在实际应用中外键约束应该正确引用目标表的主键列,在上述例子中应该是参照 `DEPTEXPM.DEPTNO` 而不是 `(EMPLNO)`,这可能是示例中的笔误。
### ORDEREXPM 表
对于订单表 `ORDEREXPM` 来说,我们可以设置以下约束:
- 主键:已设定 `ORDERNO`
- 外键:连接到 `EMPLEXPM` 表的 `EMPLNO` 字段和可能存在的客户编号 `CUSTNO`
- 检查约束:成本不能小于零
- 允许空值约束:员工编号可能不存在(如自助下单)
```sql
ALTER TABLE ORDEREXPM
ADD CONSTRAINT FK_ORDER_EMPNO FOREIGN KEY(EMPLNO) REFERENCES EMPLEXPM(EMPLNO),
ADD CONSTRAINT CHK_COST CHECK (COST >= 0),
ADD CONSTRAINT CHK_NULL_EMPNO CHECK (EMPLNO IS NULL OR EMPLNO LIKE 'E%');
```
### DETAILEXPM 表
对于细节表 `DETAILEXPM`,我们需要考虑的是保持订单号与商品号的组合唯一性,以及数量等字段的有效范围:
```sql
ALTER TABLE DETAILEXPM
ADD CONSTRAINT PK_DETAIL PRIMARY KEY (ORDERNO, GOODSNO),
ADD CONSTRAINT CHK_DISCOUNT CHECK (DISCOUNT BETWEEN 0 AND 1),
ADD CONSTRAINT CHK_QUANTITY CHECK (QUANTITY > 0);
```
请注意,由于 `DETAILEXPM` 中的 `ORDERNO` 已被定义为主键的一部分,故不再单独定义外键关系至 `ORDEREXPM` 表;同样地,`GOODSNO` 同样作为复合主键的一部分也不再额外定义外键。
### GOODSEXPM 表
最后对于商品表 `GOODSEXPM`,可以在已有基础上追加新的约束条件:
```sql
ALTER TABLE GOODSEXPM
ADD CONSTRAINT CHK_STOCK CHECK (STOCK >= 0),
ADD CONSTRAINT CHK_UNITPRICE CHECK (UNITPRICE >= 0);
```
以上是对现有表结构进一步完善并符合题目要求的操作建议。请注意调整实际环境中适用的具体实现方式。
阅读全文