一、概述
在数据库设计中,约束是用于确保数据的准确性和一致性的规则。MySQL支持多种约束,如主键约束、唯一约束、非空约束、检查约束和外键约束等。这些约束可以确保数据的完整性,防止无效或冗余数据的产生。
二、约束演示
主键约束(PRIMARY KEY)
- 保证字段的唯一性,并且不允许为NULL。
- 一个表只能有一个主键。
示例:
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT
);
在上面的示例中,id
列被指定为主键列。
唯一约束(UNIQUE)
唯一约束确保列中的每个值都是唯一的。与主键不同,一个表可以有多个唯一约束,但每个唯一约束作用于不同的列。唯一约束允许列中包含空值。
示例:
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(50) UNIQUE,
email VARCHAR(100) UNIQUE
);
在上面的示例中,username
和email
列都被指定为唯一约束列。
非空约束(NOT NULL)
非空约束确保列中的值不能为NULL。它要求插入或更新数据时,必须为该列提供一个非空值。
示例:
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT NOT NULL,
order_date DATE NOT NULL
);
在上面的示例中,customer_id
和order_date
列都被指定为非空约束
检查约束 (CHECK)(MySQL 8.0.16及更高版本开始支持)
保证证字段的值满足特定的条件
CREATE TABLE Users (
Age INT CHECK (Age >= 18),
Username VARCHAR(255) NOT NULL,
PASSWORD VARCHAR(255),
PRIMARY KEY (Username)
);
三、外键约束
什么是外键约束?
外键约束是一个或多个字段的组合,其值依赖于在另一个表中的主键。外键约束用于确保数据在两个相关表之间的引用完整性。这意味着,你不能引用一个不存在的值。外键是防止破坏表之间连接的手段。它可以防止非法数据插入到外键列,因为它必须是它指向的那个表中的值之一。
添加外键的语法
假设我们有两个表,Users
和 Orders
,我们想要在Orders
表中为UserID
字段添加一个外键约束,该字段引用Users
表的ID
字段:
ALTER TABLE Orders
ADD FOREIGN KEY (UserID) REFERENCES Users(ID);
删除/更新行为
- 当在外键关联的表中更新或删除记录时,我们必须考虑如何处理关联的记录。MySQL提供了几种处理方式:
- CASCADE: 当父表(参考表)中的记录被删除或更新时,子表中相应的记录也会被删除或更新。
- SET NULL: 当父表中的记录被删除或更新时,子表中相应的外键字段的值会被设置为NULL。但前提是,该外键字段允许NULL值。
- NO ACTION: 如果子表中存在与父表相关的记录,则不允许删除或更新父表中的记录。
- RESTRICT: 同NO ACTION。
- SET DEFAULT: 当父表中的记录被删除或更新时,子表中相应的外键字段的值会被设置为其默认值。但前提是,该外键字段已定义了默认值。例如,如果我们想在删除
Users
表的记录时,将Orders
表中相关的记录的UserID
设置为NULL,我们可以这样定义外键:ALTER TABLE Orders ADD FOREIGN KEY (UserID) REFERENCES Users(ID) ON DELETE SET NULL;