MySQL 数据库约束详解:确保数据完整性与一致性
在数据库设计中,约束(Constraints)是确保数据完整性和一致性的重要工具。MySQL 提供了多种约束类型,包括非空约束、唯一约束、主键约束、检查约束、默认约束和外键约束。本文将详细介绍这些约束的作用、常用格式以及如何在创建数据表时熟练运用它们。
1. 非空约束(NOT NULL)
作用:确保字段的值不能为 NULL。
常用格式:
字段名 数据类型 NOT NULL
示例:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
ename VARCHAR(255) NOT NULL,
salary DECIMAL(10, 2)
);
在这个例子中,ename 字段不能为 NULL。非空约束确保了该字段在插入数据时必须提供一个非 NULL 的值,从而避免了数据缺失的情况。
2. 唯一约束(UNIQUE)
作用:确保字段的值在整个表中是唯一的。多个 NULL 不算重复。
常用格式:
字段名 字段类型 UNIQUE
示例:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) UNIQUE,
ename VARCHAR(255) NOT NULL
);
在这个例子中,email 字段的值在整个表中必须是唯一的。唯一约束确保了该字段的值不会重复,从而避免了数据冗余的问题。
3. 主键约束(PRIMARY KEY)
特点:非空且唯一,一张表只能有一个主键。
常用格式:
字段名 数据类型 PRIMARY KEY
示例:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) UNIQUE,
ename VARCHAR(255) NOT NULL
);
在这个例子中,id 字段是主键,自动递增且唯一标识每一行数据。主键约束确保了该字段的值非空且唯一,从而提供了数据的唯一标识。
4. 检查约束(CHECK)
作用:确保字段的值满足指定的条件。
注意:MySQL 8.0.16 及以上版本支持 CHECK 约束,但之前的版本不支持。
常用格式:
字段名 数据类型 CHECK (条件)
示例:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
age INT CHECK (age >= 18),
ename VARCHAR(255) NOT NULL
);
在这个例子中,age 字段的值必须大于等于 18。检查约束确保了该字段的值满足指定的条件,从而避免了不符合要求的数据插入。
5. 默认约束(DEFAULT)
特点:保存数据时,未指定值则采用默认值。
常用格式:
列名 数据类型 DEFAULT 默认值
示例:
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
ename VARCHAR(255) NOT NULL,
salary DECIMAL(10, 2) DEFAULT 0.00
);
在这个例子中,如果插入数据时未提供 salary 字段的值,则默认为 0.00。默认约束确保了在未指定值的情况下,字段能够自动填充默认值,从而简化了数据插入操作。
6. 外键约束(FOREIGN KEY)
作用:确保字段的值必须存在于另一个表的某个字段中,用于维护表之间的引用完整性。
常用格式:
CREATE TABLE table_name (
column_name datatype,
...
FOREIGN KEY (column_name) REFERENCES other_table(other_column)
);
示例:
CREATE TABLE departments (
dept_id INT AUTO_INCREMENT PRIMARY KEY,
dept_name VARCHAR(255) NOT NULL
);
CREATE TABLE employees (
id INT AUTO_INCREMENT PRIMARY KEY,
ename VARCHAR(255) NOT NULL,
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);
在这个例子中,employees 表中的 dept_id 字段引用了 departments 表中的 dept_id 字段。外键约束确保了 dept_id 字段的值必须存在于 departments 表中,从而维护了表之间的引用完整性。
主键与唯一约束的区别
尽管主键(PRIMARY KEY)和唯一约束(UNIQUE)都具有非空且唯一的特性,但它们在实际使用中有一些关键的区别:
NULL 值:
主键:不能为 NULL。
唯一约束:可以为 NULL,并且允许多个 NULL 值。
唯一标识:
主键:用于唯一标识表中的每一行数据。
唯一约束:用于确保字段的值在整个表中是唯一的,但不一定用于唯一标识每一行数据。
数量限制:
主键:一张表只能有一个主键。
唯一约束:一张表可以有多个唯一约束。
自动索引:
主键:自动创建唯一索引。
唯一约束:自动创建唯一索引。
总结
通过合理使用这些约束,你可以确保数据的完整性和一致性。以下是每个约束的简要总结:
非空约束(NOT NULL):确保字段的值不能为 NULL。
格式:字段名 数据类型 NOT NULL
唯一约束(UNIQUE):确保字段的值在整个表中是唯一的,多个 NULL 不算重复。
格式:字段名 字段类型 UNIQUE
主键约束(PRIMARY KEY):非空且唯一,一张表只能有一个主键。
格式:字段名 数据类型 PRIMARY KEY
检查约束(CHECK):确保字段的值满足指定的条件。
格式:字段名 数据类型 CHECK (条件)
默认约束(DEFAULT):保存数据时,未指定值则采用默认值。
格式:列名 数据类型 DEFAULT 默认值
外键约束(FOREIGN KEY):确保字段的值必须存在于另一个表的某个字段中,用于维护表之间的引用完整性。
格式:FOREIGN KEY (column_name) REFERENCES other_table(other_column)
通过熟练掌握这些约束,你可以在创建数据表时更好地管理和维护数据库中的数据,确保数据的完整性和一致性。