数据库约束设计与实现

MySQLBeginner
立即练习

介绍

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

👀 预览

数据库模式约束预览

🎯 任务

在这个项目中,你将学习:

  • 如何在 salgrade 表上创建复合主键
  • 如何在 emp 表的 deptno 字段上指定外键
  • 如何使用唯一约束来防止 emp 表中 ename 字段出现重复值
  • 如何为 emp 表的 comm 字段设置默认值
  • 如何使用检查约束来防止在 emp 表的 hiredate 字段中输入晚于 2022 年 2 月 28 日的入职日期

🏆 成果

完成本项目后,你将能够:

  • 理解数据完整性约束在数据库设计中的重要性
  • 在 MySQL 数据库中实施各种类型的约束
  • 应用维护数据质量和一致性的最佳实践
  • 排查和调试与数据库约束相关的问题

启动 MySQL 服务器并导入数据库

在这一步中,你将学习如何启动 MySQL 服务并导入 personnel.sql 数据库。按照以下步骤完成此步骤:

  1. 启动 MySQL:

    sudo /etc/init.d/mysql start
  2. personnel.sql 数据库导入 MySQL。你可以在终端中运行以下命令来完成此操作:

    mysql -u root < /home/labex/project/personnel.sql

此命令将使用 root 用户将 personnel.sql 数据库导入 MySQL。

✨ 查看解决方案并练习

向‘salgrade’表添加复合主键

在这一步中,你将学习如何向“salgrade”表添加复合主键。按照以下步骤完成此步骤:

  1. 登录到 MySQL 终端:

    mysql -uroot
  2. 使用“personnel”数据库:

    USE `personnel`;
  3. 向“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 日的入职日期。

按照以下步骤完成此步骤。

  1. 使用“personnel”数据库:

    USE `personnel`;
  2. 在“emp”表的“deptno”字段上指定一个外键,引用“dept”表中的“deptno”字段:

    ALTER TABLE emp
    ADD FOREIGN KEY (deptno) REFERENCES dept(deptno);
  3. 使用唯一约束来防止“emp”表中“ename”字段出现重复值:

    ALTER TABLE emp
    ADD UNIQUE (ename);
  4. 使用默认值约束将“emp”表中“comm”字段的默认值设置为 100:

    ALTER TABLE emp
    ALTER COLUMN comm SET DEFAULT 100;
  5. 使用检查约束来防止在“emp”表的“hiredate”字段中输入晚于 2022 年 2 月 28 日的入职日期:

    ALTER TABLE emp
    ADD CHECK (hiredate <= '2022-02-28');
✨ 查看解决方案并练习

查看表结构

在这一步中,你将使用命令来显示表 salgradeemp 的结构:

  1. 显示表 salgrade 的结构:

    desc salgrade;
  2. 显示表 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)中多做一些实验来提升你的技能。