在数据库设计中,确保数据的准确性和可靠性是至关重要的。MySQL通过提供一系列完整性约束(Integrity Constraints)来实现这一目标,这些约束用于限制存储在数据库表中的数据类型、格式以及数据间的相互关系。完整性约束不仅有助于维护数据的正确性,还能提高数据库的性能和安全性。本章将深入探讨MySQL中定义完整性约束的各个方面,包括主键约束、外键约束、唯一约束、检查约束(MySQL 8.0.16及以上版本支持)以及默认值与非空约束。
主键约束是数据库表中最重要的一种约束,用于唯一标识表中的每一行记录。主键约束具有以下特性:
定义主键约束的SQL语法:
CREATE TABLE table_name (
column1 datatype CONSTRAINT pk_name PRIMARY KEY,
column2 datatype,
...
);
-- 或者在创建表后添加主键约束
ALTER TABLE table_name
ADD CONSTRAINT pk_name PRIMARY KEY (column1, column2); -- 复合主键示例
外键约束用于在两个表之间建立和维护参照完整性。外键是一个表中的字段,它指向另一个表的主键。通过外键约束,可以确保一个表中的数据与另一个表中的数据保持一致性。
外键约束的特性:
定义外键约束的SQL语法:
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
...
foreign_key_column datatype,
CONSTRAINT fk_name FOREIGN KEY (foreign_key_column)
REFERENCES parent_table(parent_key_column)
ON DELETE CASCADE -- 或 SET NULL, NO ACTION, RESTRICT, SET DEFAULT
ON UPDATE CASCADE; -- 同上
);
-- 或者在创建表后添加外键约束
ALTER TABLE table_name
ADD CONSTRAINT fk_name FOREIGN KEY (foreign_key_column)
REFERENCES parent_table(parent_key_column)
ON DELETE CASCADE
ON UPDATE CASCADE;
唯一约束确保表中的一列或列组合中的所有值都是唯一的,与主键约束类似,但唯一约束允许NULL值(除非列被定义为NOT NULL)。一个表可以有多个唯一约束。
定义唯一约束的SQL语法:
CREATE TABLE table_name (
column1 datatype UNIQUE,
column2 datatype,
...
CONSTRAINT uc_name UNIQUE (column3, column4) -- 复合唯一约束
);
-- 或者在创建表后添加唯一约束
ALTER TABLE table_name
ADD CONSTRAINT uc_name UNIQUE (column3, column4);
检查约束用于限制列中可以存储的值的范围。它允许你指定一个条件表达式,该表达式必须为TRUE,否则数据库将拒绝插入或更新操作。
定义检查约束的SQL语法:
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
...
CONSTRAINT chk_name CHECK (condition)
);
-- 或者在创建表后添加检查约束
ALTER TABLE table_name
ADD CONSTRAINT chk_name CHECK (condition);
示例:
CREATE TABLE employees (
id INT AUTO_INCREMENT,
name VARCHAR(100),
age INT,
salary DECIMAL(10, 2),
CONSTRAINT pk_employees PRIMARY KEY (id),
CONSTRAINT chk_age CHECK (age >= 18 AND age <= 65),
CONSTRAINT chk_salary CHECK (salary > 0)
);
虽然默认值和非空约束不直接属于完整性约束的范畴,但它们对于确保数据的完整性和准确性同样重要。
默认值(DEFAULT):为列指定一个默认值,当插入新记录时,如果没有为该列提供值,则自动使用默认值。
示例:
CREATE TABLE orders (
order_id INT AUTO_INCREMENT,
order_date DATE DEFAULT CURRENT_DATE,
...
);
非空约束(NOT NULL):确保列在插入或更新记录时不能包含NULL值。
示例:
CREATE TABLE users (
user_id INT AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
...
);
完整性约束是数据库设计中不可或缺的一部分,它们通过限制数据的类型、格式和关系,确保了数据的准确性、一致性和可靠性。MySQL提供了多种类型的完整性约束,包括主键约束、外键约束、唯一约束、检查约束(MySQL 8.0.16及以上版本)、默认值和非空约束。通过合理使用这些约束,可以构建出高效、安全且易于维护的数据库系统。在设计和实现数据库时,深入理解并恰当应用这些约束,将极大地提升数据库的质量和性能。