介绍
在这个项目中,你将学习如何向数据库模式添加各种约束,包括主键、外键、唯一约束、默认值和检查约束。在本项目结束时,你将更好地理解如何在关系型数据库中设计和实施数据完整性规则。
👀 预览

🎯 任务
在这个项目中,你将学习:
- 如何在
salgrade表上创建复合主键 - 如何在
emp表的deptno字段上指定外键 - 如何使用唯一约束来防止
emp表中ename字段出现重复值 - 如何为
emp表的comm字段设置默认值 - 如何使用检查约束来防止在
emp表的hiredate字段中输入晚于 2022 年 2 月 28 日的入职日期
🏆 成果
完成本项目后,你将能够:
- 理解数据完整性约束在数据库设计中的重要性
- 在 MySQL 数据库中实施各种类型的约束
- 应用维护数据质量和一致性的最佳实践
- 排查和调试与数据库约束相关的问题
启动 MySQL 服务器并导入数据库
在这一步中,你将学习如何启动 MySQL 服务并导入 personnel.sql 数据库。按照以下步骤完成此步骤:
启动 MySQL:
sudo /etc/init.d/mysql start将
personnel.sql数据库导入 MySQL。你可以在终端中运行以下命令来完成此操作:mysql -u root < /home/labex/project/personnel.sql
此命令将使用 root 用户将 personnel.sql 数据库导入 MySQL。
向‘salgrade’表添加复合主键
在这一步中,你将学习如何向“salgrade”表添加复合主键。按照以下步骤完成此步骤:
登录到 MySQL 终端:
mysql -uroot使用“personnel”数据库:
USE `personnel`;向“salgrade”表添加复合主键,将“grade”、“losal”和“hisal”字段作为复合主键:
ALTER TABLE salgrade ADD PRIMARY KEY (grade, losal, hisal);
这将使用“grade”、“losal”和“hisal”字段在“salgrade”表上创建一个复合主键。
向‘emp’表添加约束
在这一步中,你将学习:
- 如何在“emp”表的“deptno”字段上指定一个外键,该外键引用“dept”表中的“deptno”字段。
- 如何使用唯一约束来防止“emp”表中的“name”字段出现重复值。
- 如何使用默认值约束将“emp”表中“comm”字段的默认值设置为 100。
- 如何使用检查约束来防止在“emp”表的“hiredate”字段中输入晚于 2022 年 2 月 28 日的入职日期。
按照以下步骤完成此步骤。
使用“personnel”数据库:
USE `personnel`;在“emp”表的“deptno”字段上指定一个外键,引用“dept”表中的“deptno”字段:
ALTER TABLE emp ADD FOREIGN KEY (deptno) REFERENCES dept(deptno);使用唯一约束来防止“emp”表中“ename”字段出现重复值:
ALTER TABLE emp ADD UNIQUE (ename);使用默认值约束将“emp”表中“comm”字段的默认值设置为 100:
ALTER TABLE emp ALTER COLUMN comm SET DEFAULT 100;使用检查约束来防止在“emp”表的“hiredate”字段中输入晚于 2022 年 2 月 28 日的入职日期:
ALTER TABLE emp ADD CHECK (hiredate <= '2022-02-28');
查看表结构
在这一步中,你将使用命令来显示表 salgrade 和 emp 的结构:
显示表
salgrade的结构:desc salgrade;显示表
emp的结构:desc emp;
你应该会看到以下输出:
MariaDB [personnel]> desc salgrade;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| grade | int(4) | NO | PRI | NULL | |
| losal | double(7,2) | NO | PRI | NULL | |
| hisal | double(7,2) | NO | PRI | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.001 sec)
MariaDB [personnel]> desc emp;
+----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| empno | int(4) | NO | PRI | NULL | |
| ename | varchar(20) | YES | UNI | NULL | |
| job | varchar(20) | YES | | NULL | |
| mgr | varchar(20) | YES | | NULL | |
| hiredate | date | YES | | NULL | |
| sal | double(7,2) | YES | | NULL | |
| comm | double(7,2) | YES | | 100.00 | |
| deptno | int(4) | YES | MUL | NULL | |
+----------+-------------+------+-----+---------+-------+
8 rows in set (0.001 sec)
恭喜你!你已成功完成该项目。
总结
恭喜你!你已完成此项目。你可以在实验(LabEx)中多做一些实验来提升你的技能。



