当前位置:  首页>> 技术小册>> MySQL从入门到精通(四)

13.1 定义完整性约束

在数据库设计中,确保数据的准确性和可靠性是至关重要的。MySQL通过提供一系列完整性约束(Integrity Constraints)来实现这一目标,这些约束用于限制存储在数据库表中的数据类型、格式以及数据间的相互关系。完整性约束不仅有助于维护数据的正确性,还能提高数据库的性能和安全性。本章将深入探讨MySQL中定义完整性约束的各个方面,包括主键约束、外键约束、唯一约束、检查约束(MySQL 8.0.16及以上版本支持)以及默认值与非空约束。

13.1.1 主键约束(PRIMARY KEY Constraint)

主键约束是数据库表中最重要的一种约束,用于唯一标识表中的每一行记录。主键约束具有以下特性:

  • 唯一性:表中的每一行都必须有一个唯一的主键值,不允许有重复。
  • 非空性:主键列不能接受NULL值。
  • 一个表只能有一个主键,但主键可以由一个或多个列(字段)组成,这样的主键称为复合主键。

定义主键约束的SQL语法

  1. CREATE TABLE table_name (
  2. column1 datatype CONSTRAINT pk_name PRIMARY KEY,
  3. column2 datatype,
  4. ...
  5. );
  6. -- 或者在创建表后添加主键约束
  7. ALTER TABLE table_name
  8. ADD CONSTRAINT pk_name PRIMARY KEY (column1, column2); -- 复合主键示例

13.1.2 外键约束(FOREIGN KEY Constraint)

外键约束用于在两个表之间建立和维护参照完整性。外键是一个表中的字段,它指向另一个表的主键。通过外键约束,可以确保一个表中的数据与另一个表中的数据保持一致性。

外键约束的特性

  • 参照完整性:确保外键列中的每个值都必须在被参照的主键列中存在。
  • 级联操作:当被参照的主键记录被删除或更新时,外键列可以自动更新或删除相应的记录(取决于定义的级联规则)。

定义外键约束的SQL语法

  1. CREATE TABLE table_name (
  2. column1 datatype,
  3. column2 datatype,
  4. ...
  5. foreign_key_column datatype,
  6. CONSTRAINT fk_name FOREIGN KEY (foreign_key_column)
  7. REFERENCES parent_table(parent_key_column)
  8. ON DELETE CASCADE -- SET NULL, NO ACTION, RESTRICT, SET DEFAULT
  9. ON UPDATE CASCADE; -- 同上
  10. );
  11. -- 或者在创建表后添加外键约束
  12. ALTER TABLE table_name
  13. ADD CONSTRAINT fk_name FOREIGN KEY (foreign_key_column)
  14. REFERENCES parent_table(parent_key_column)
  15. ON DELETE CASCADE
  16. ON UPDATE CASCADE;

13.1.3 唯一约束(UNIQUE Constraint)

唯一约束确保表中的一列或列组合中的所有值都是唯一的,与主键约束类似,但唯一约束允许NULL值(除非列被定义为NOT NULL)。一个表可以有多个唯一约束。

定义唯一约束的SQL语法

  1. CREATE TABLE table_name (
  2. column1 datatype UNIQUE,
  3. column2 datatype,
  4. ...
  5. CONSTRAINT uc_name UNIQUE (column3, column4) -- 复合唯一约束
  6. );
  7. -- 或者在创建表后添加唯一约束
  8. ALTER TABLE table_name
  9. ADD CONSTRAINT uc_name UNIQUE (column3, column4);

13.1.4 检查约束(CHECK Constraint,MySQL 8.0.16+)

检查约束用于限制列中可以存储的值的范围。它允许你指定一个条件表达式,该表达式必须为TRUE,否则数据库将拒绝插入或更新操作。

定义检查约束的SQL语法

  1. CREATE TABLE table_name (
  2. column1 datatype,
  3. column2 datatype,
  4. ...
  5. CONSTRAINT chk_name CHECK (condition)
  6. );
  7. -- 或者在创建表后添加检查约束
  8. ALTER TABLE table_name
  9. ADD CONSTRAINT chk_name CHECK (condition);

示例

  1. CREATE TABLE employees (
  2. id INT AUTO_INCREMENT,
  3. name VARCHAR(100),
  4. age INT,
  5. salary DECIMAL(10, 2),
  6. CONSTRAINT pk_employees PRIMARY KEY (id),
  7. CONSTRAINT chk_age CHECK (age >= 18 AND age <= 65),
  8. CONSTRAINT chk_salary CHECK (salary > 0)
  9. );

13.1.5 默认值与非空约束

虽然默认值和非空约束不直接属于完整性约束的范畴,但它们对于确保数据的完整性和准确性同样重要。

  • 默认值(DEFAULT):为列指定一个默认值,当插入新记录时,如果没有为该列提供值,则自动使用默认值。

    示例

    1. CREATE TABLE orders (
    2. order_id INT AUTO_INCREMENT,
    3. order_date DATE DEFAULT CURRENT_DATE,
    4. ...
    5. );
  • 非空约束(NOT NULL):确保列在插入或更新记录时不能包含NULL值。

    示例

    1. CREATE TABLE users (
    2. user_id INT AUTO_INCREMENT,
    3. username VARCHAR(50) NOT NULL,
    4. ...
    5. );

结论

完整性约束是数据库设计中不可或缺的一部分,它们通过限制数据的类型、格式和关系,确保了数据的准确性、一致性和可靠性。MySQL提供了多种类型的完整性约束,包括主键约束、外键约束、唯一约束、检查约束(MySQL 8.0.16及以上版本)、默认值和非空约束。通过合理使用这些约束,可以构建出高效、安全且易于维护的数据库系统。在设计和实现数据库时,深入理解并恰当应用这些约束,将极大地提升数据库的质量和性能。


该分类下的相关小册推荐: