MySQL数据表的常见约束小结

 更新时间:2024年12月03日 09:34:28   作者:白话Learning  
在数据库设计中,约束(Constraints)是用于确保数据的完整性、准确性和一致性的规则,MySQL 提供了多种约束类型,帮助我们规范数据存储,本文给大家介绍了MySQL数据表的常见约束,需要的朋友可以参考下

在数据库设计中,约束(Constraints)是用于确保数据的完整性、准确性和一致性的规则。MySQL 提供了多种约束类型,帮助我们规范数据存储,并确保其符合预期的规则。常见的约束包括 主键(Primary Key)、外键(Foreign Key)、唯一约束(Unique)、非空约束(Not Null)、默认值(Default) 和 检查约束(Check)。

1. 主键约束(Primary Key)

作用:主键是用于唯一标识表中每一行数据的列。它不仅要求该列的值是唯一的,而且不能为空(即不允许 NULL)。每个表只能有一个主键。

特点:

  • 唯一性:主键列中的每个值必须是唯一的。
  • 不允许空值:主键列不能包含 NULL 值。
  • 自动索引:MySQL 会自动为主键列创建索引,优化查询性能。

示例:

CREATE TABLE employees (
    employee_id INT NOT NULL,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    PRIMARY KEY (employee_id)
);

在上述示例中,employee_id 是主键,它唯一标识每个员工记录,并且不能为 NULL。

2. 外键约束(Foreign Key)

作用:外键约束用于在两张表之间建立连接关系,确保一个表中的某列数据必须与另一表中的主键或唯一键数据相匹配。外键用于维护数据的参照完整性。

特点:

  • 外键列的值必须与参照表中的主键或唯一列值一致。
  • 外键约束可以定义更新或删除时的级联操作,例如:ON DELETE CASCADE 或 ON UPDATE CASCADE。

示例:

CREATE TABLE departments (
    department_id INT NOT NULL,
    department_name VARCHAR(50),
    PRIMARY KEY (department_id)
);

CREATE TABLE employees (
    employee_id INT NOT NULL,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    department_id INT,
    PRIMARY KEY (employee_id),
    FOREIGN KEY (department_id) REFERENCES departments(department_id)
);

在这个例子中,employees 表中的 department_id 列是外键,指向 departments 表中的 department_id 列。这确保了每个员工必须隶属于某个部门。

3. 唯一约束(Unique)

作用:唯一约束确保某一列中的所有值都是唯一的,不允许重复。与主键不同的是,唯一约束允许列中存在 NULL 值,但多个 NULL 值可以存在。

特点:

  • 保证列中所有非 NULL 的值是唯一的。
  • 允许多个 NULL 值(在不同数据库系统中可能有所不同)。

示例:

CREATE TABLE users (
    user_id INT NOT NULL,
    username VARCHAR(50) UNIQUE,
    email VARCHAR(100) UNIQUE,
    PRIMARY KEY (user_id)
);

在上面的表中,username 和 email 列具有唯一约束,确保没有两个用户使用相同的用户名或邮箱。

4. 非空约束(Not Null)

作用:非空约束确保列中的数据不能为 NULL。当定义了 NOT NULL 约束时,插入数据时必须为该列提供一个有效的值。

特点:

  • 强制要求列必须有值。
  • 常用于对业务逻辑有特殊要求的字段。

示例

CREATE TABLE products (
    product_id INT NOT NULL,
    product_name VARCHAR(100) NOT NULL,
    price DECIMAL(10, 2),
    PRIMARY KEY (product_id)
);

在该示例中,product_name 列不能为 NULL,每个产品必须有名称。

5. 默认值约束(Default)

作用:默认值约束用于在插入数据时为列指定一个默认值。当插入数据时没有提供该列的值时,MySQL 会使用默认值。

特点:

  • 提供一个列的默认值。
  • 如果未指定列的值,数据库将使用默认值。

示例

CREATE TABLE orders (
    order_id INT NOT NULL,
    order_date DATE DEFAULT CURRENT_DATE,
    status VARCHAR(20) DEFAULT 'Pending',
    PRIMARY KEY (order_id)
);

在这个例子中,order_date 列的默认值是当前日期,而 status 列的默认值是 ‘Pending’。

6. 检查约束(Check)

作用:检查约束用于限制列中的数据必须满足某个条件。它可以确保插入的数据符合特定规则。此约束在 MySQL 8.0.16 及之后版本中得到了支持。

特点:

  • 强制列中的数据符合指定的条件。
  • 可以使用逻辑表达式定义复杂的条件。

示例:

CREATE TABLE employees (
    employee_id INT NOT NULL,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    age INT,
    salary DECIMAL(10, 2),
    PRIMARY KEY (employee_id),
    CHECK (age >= 18),
    CHECK (salary >= 0)
);

在该表中,age 列的值必须大于等于 18,salary 列的值必须大于等于 0。

7. 逻辑与物理连接性

在数据库中,逻辑连接性和物理连接性是数据库设计中重要的概念:

逻辑连接性 指的是通过外键约束在表之间建立的关联关系。这些关联定义了数据如何在逻辑上被组织和约束。

物理连接性 侧重于数据库表在物理存储上的关联。例如,数据库可以使用索引来提高查询效率,尤其是在主键和唯一约束下,MySQL 会为这些列自动创建索引。

示例:

CREATE TABLE products (
    product_id INT NOT NULL,
    product_name VARCHAR(100),
    PRIMARY KEY (product_id)
);

CREATE TABLE order_items (
    order_item_id INT NOT NULL,
    product_id INT NOT NULL,
    quantity INT,
    PRIMARY KEY (order_item_id),
    FOREIGN KEY (product_id) REFERENCES products(product_id)
);

在上述示例中,order_items 表通过 product_id 外键与 products 表建立了逻辑上的连接。物理上,MySQL 可能会为 product_id 列创建索引,以加速查询。

8. 修改约束(ALTER TABLE)

如果在创建表后,需要修改表的约束,可以使用 ALTER TABLE 语句来添加、删除或修改约束。

示例:添加约束

ALTER TABLE employees
ADD CONSTRAINT chk_age CHECK (age >= 18 AND age <= 65);

示例:删除约束

ALTER TABLE employees
DROP CONSTRAINT chk_age;

9. 综合示例:创建完整的订单系统

结合前面的约束,以下是一个简单的订单系统设计示例,其中包含主键、外键、唯一约束、非空约束、默认值和检查约束:

CREATE TABLE customers (
    customer_id INT NOT NULL,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE,
    phone VARCHAR(15),
    PRIMARY KEY (customer_id)
);

CREATE TABLE products (
    product_id INT NOT NULL,
    product_name VARCHAR(100) NOT NULL,
    price DECIMAL(10, 2) NOT NULL,
    PRIMARY KEY (product_id)
);

CREATE TABLE orders (
    order_id INT NOT NULL,
    customer_id INT NOT NULL,
    order_date DATE DEFAULT CURRENT_DATE,
    status VARCHAR(20) DEFAULT 'Pending',
    PRIMARY KEY (order_id),
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

CREATE TABLE order_items (
    order_item_id INT NOT NULL,
    order_id INT NOT NULL,
    product_id INT NOT NULL,
    quantity INT CHECK (quantity > 0),
    PRIMARY KEY (order_item_id),
    FOREIGN KEY (order_id) REFERENCES orders(order_id),
    FOREIGN KEY (product_id) REFERENCES products(product_id)
);

在这个系统中:

  • customers 表存储客户信息,email 列具有唯一约束,确保每个客户的邮箱地址唯一。
  • products 表存储商品信息,每个商品有唯一的 product_id。
  • orders 表记录客户订单,customer_id 是外键,指向 customers 表。
  • order_items 表记录每个订单的商品,包含外键 order_id 和 product_id,并对 quantity 列设置了检查约束,确保每个订单项的商品数量大于 0。

结语

通过合理使用 MySQL 中的约束,可以确保数据的完整性、正确性和一致性。在设计数据库时,约束不仅能防止错误数据的插入,还能提高数据查询和操作的效率。掌握这些约束的使用,将帮助我们在实际项目中构建更高质量的数据库系统。

以上就是MySQL数据表的常见约束小结的详细内容,更多关于MySQL数据表约束的资料请关注脚本之家其它相关文章!

相关文章

  • mysql配置文件的使用教程

    mysql配置文件的使用教程

    这篇文章主要介绍了mysql配置文件的使用教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-10-10
  • MySQL借助DB实现分布式锁思路详解

    MySQL借助DB实现分布式锁思路详解

    这篇文章主要给大家介绍了关于MySQL借助DB实现分布式锁思路的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-10-10
  • MySQL存储过程未执行的问题排查过程

    MySQL存储过程未执行的问题排查过程

    文章讲述了对 MySQL 存储过程未执行的问题排查过程,先后排查了数据库版本升级、用户权限不足,最终发现是存储过程创建时的 SQL 模式导致,即使之后去掉该模式,存储过程内部仍沿用旧模式,重新创建存储过程后问题解决,需要的朋友可以参考下
    2025-02-02
  • 关于k8s环境部署mysql主从的问题

    关于k8s环境部署mysql主从的问题

    这篇文章主要介绍了k8s环境部署mysql主从的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • 关于skip_name_resolve参数的总结分享

    关于skip_name_resolve参数的总结分享

    下面小编就为大家带来一篇关于skip_name_resolve参数的总结分享。小编觉得挺不错的,现在分享给大家。给大家一个参考。一起跟随小编过来看看吧
    2016-03-03
  • Mysql8.0密码问题mysql_native_password和caching_sha2_password详解

    Mysql8.0密码问题mysql_native_password和caching_sha2_password详解

    这篇文章主要介绍了Mysql8.0密码问题mysql_native_password和caching_sha2_password,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • 最全50个Mysql数据库查询练习题

    最全50个Mysql数据库查询练习题

    这篇文章主要介绍了最全50个数据库查询练习题,Mysql数据库版本,全部都验证过
    2020-12-12
  • MySQL实现批量插入测试数据的方式总结

    MySQL实现批量插入测试数据的方式总结

    在开发过程中经常需要一些测试数据, 这个时候如果手敲的话, 十行二十行还好, 多了就很死亡了, 接下来介绍两种常用的MySQL测试数据批量生成方式,希望对大家有所帮助
    2023-05-05
  • MySQL添加索引及添加字段并建立索引方式

    MySQL添加索引及添加字段并建立索引方式

    这篇文章主要介绍了MySQL添加索引及添加字段并建立索引方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 浅析MySQL如何实现事务隔离

    浅析MySQL如何实现事务隔离

    使用过关系型数据库的,应该都事务的概念有所了解,知道事务有 ACID 四个基本属性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),今天我们主要来理解一下事务的隔离性
    2021-06-06

最新评论