从0开始学mysql 第六课:MySQL 数据库约束(Constraints)

第六课:MySQL 数据库约束(Constraints)

学习目标

在本课中,我们将学习数据库的约束(Constraints)系统,这些规则用于限制存储在数据库表中的数据类型。掌握约束对于维护数据的完整性、一致性和准确性至关重要。我们将重点了解以下内容:

  • 不同类型的约束及其用途。
  • 如何在创建或修改表时应用这些约束。
  • 约束如何影响数据插入、更新和删除。
学习内容
1. 约束的基本概念

数据库约束是应用于数据库表上的规则,它们可以是:

  • NOT NULL:指定列不能存储 NULL 值。
  • UNIQUE:保证列中的所有值都是不同的。
  • PRIMARY KEY:独特标识数据库表中的每一行。
  • FOREIGN KEY:保证一个表中的数据与另一个表的数据相关联。
  • CHECK:确保列中的值满足指定的条件。
  • DEFAULT:为列指定默认值。
2. 实现约束
NOT NULL 约束
  • 语法示例:
CREATE TABLE Students (
    StudentID int NOT NULL,
    StudentName varchar(255) NOT NULL,
    RegistrationDate date NOT NULL
);
  • 描述:确保创建记录时必须提供StudentIDStudentNameRegistrationDate的值。
UNIQUE 约束
  • 语法示例:
CREATE TABLE Students (
    StudentID int NOT NULL,
    StudentEmail varchar(255) UNIQUE
);
  • 描述:保证所有学生的电子邮件地址都是独一无二的。
PRIMARY KEY 约束
  • 语法示例:
CREATE TABLE Students (
    StudentID int NOT NULL,
    StudentName varchar(255),
    PRIMARY KEY (StudentID)
);
  • 描述:StudentID是表的主键,用于唯一标识表中的每一行。
FOREIGN KEY 约束
  • 语法示例:
CREATE TABLE Enrollment (
    EnrollmentID int,
    StudentID int,
    FOREIGN KEY (StudentID) REFERENCES Students(StudentID)
);
  • 描述:StudentIDEnrollment表的外键,它引用Students表的StudentID
CHECK 约束
  • 语法示例:
CREATE TABLE Products (
    ProductID int NOT NULL,
    ProductName varchar(255) NOT NULL,
    Price decimal NOT NULL CHECK (Price >= 0)
);
  • 描述:CHECK约束确保所有产品的价格都不会小于0。
DEFAULT 约束
  • 语法示例:
CREATE TABLE Students (
    StudentID int NOT NULL,
    StudentName varchar(255) NOT NULL,
    RegistrationDate date DEFAULT CURRENT_DATE
);
  • 描述:如果在创建记录时没有提供RegistrationDate,它将默认为当前日期。
3. 约束的应用和影响
  • 当尝试插入或更新数据时,如果违反了约束条件,数据库系统将拒绝该操作并返回错误。
  • 约束有助于保护数据,防止无效或不一致的信息进入数据库。
  • 约束在数据库设计中非常重要,因为它们确保了数据的准确性和可靠性。
课后练习
  1. 创建带约束的表:创建一个名为Courses的表,它具有课程编号(CourseID,主键)、课程名称(CourseName,不为空且唯一)和课程简介(Description,默认值为’No description provided’)。
CREATE TABLE Courses (
    CourseID int NOT NULL,
    CourseName varchar(255) NOT NULL UNIQUE,
    Description text DEFAULT 'No description provided',
    PRIMARY KEY (CourseID)
);
  1. 更新表添加外键约束:给一个已经存在的Enrollment表,将CourseID字段设置为Courses表的外键。
ALTER TABLE Enrollment
ADD FOREIGN KEY (CourseID) REFERENCES Courses(CourseID);
  1. 使用CHECK约束强制限制:创建一个名为Exams的表,它包含考试分数(Score),并确保分数在0到100之间。
CREATE TABLE Exams (
    ExamID int NOT NULL PRIMARY KEY,
    Score int CHECK (Score >= 0 AND Score <= 100)
);
  1. 插入数据时考虑约束:向Courses表中添加一些课程,确保数据符合约束的要求。
INSERT INTO Courses (CourseID, CourseName, Description)
VALUES (1, 'Introduction to Databases', 'A course on database fundamentals.');
  1. 违反约束的处理:尝试插入或更新数据,使其违反上述表中的某个约束,并观察系统如何响应。
-- 这将失败,因为它违反了`CourseName`的`UNIQUE`约束
INSERT INTO Courses (CourseID, CourseName)
VALUES (2, 'Introduction to Databases');

通过本课的学习和实践,你应该对如何在MySQL中创建和管理约束有了深入的理解,并能够利用约束来保护数据的完整性。在设计数据库和表时应当仔细考虑哪些约束适用,并确保所有的数据操作都符合这些规则。

第七课:MySQL 高级查询技巧