MySQL 数据库约束详解:确保数据完整性与一致性
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)
- 格式:
通过熟练掌握这些约束,你可以在创建数据表时更好地管理和维护数据库中的数据,确保数据的完整性和一致性。