数据库约束设计与实现

MySQLMySQLBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

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

👀 预览

数据库模式约束预览

🎯 任务

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

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

🏆 成果

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

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

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mysql(("MySQL")) -.-> mysql/BasicKeywordsandStatementsGroup(["Basic Keywords and Statements"]) mysql(("MySQL")) -.-> mysql/DatabaseFunctionsandDataTypesGroup(["Database Functions and Data Types"]) mysql(("MySQL")) -.-> mysql/SystemManagementToolsGroup(["System Management Tools"]) mysql/BasicKeywordsandStatementsGroup -.-> mysql/use_database("Database Selection") mysql/BasicKeywordsandStatementsGroup -.-> mysql/alter_table("Table Modification") mysql/BasicKeywordsandStatementsGroup -.-> mysql/select("Data Retrieval") mysql/BasicKeywordsandStatementsGroup -.-> mysql/source("External Code Execution") mysql/DatabaseFunctionsandDataTypesGroup -.-> mysql/database("DB Function - Info Retrieval") mysql/SystemManagementToolsGroup -.-> mysql/show_status("Status Overview") mysql/SystemManagementToolsGroup -.-> mysql/show_variables("Configuration Overview") subgraph Lab Skills mysql/use_database -.-> lab-316800{{"数据库约束设计与实现"}} mysql/alter_table -.-> lab-316800{{"数据库约束设计与实现"}} mysql/select -.-> lab-316800{{"数据库约束设计与实现"}} mysql/source -.-> lab-316800{{"数据库约束设计与实现"}} mysql/database -.-> lab-316800{{"数据库约束设计与实现"}} mysql/show_status -.-> lab-316800{{"数据库约束设计与实现"}} mysql/show_variables -.-> lab-316800{{"数据库约束设计与实现"}} end

启动 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)中多做一些实验来提升你的技能。