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批量插入BulkCopy的实现

    mysql批量插入BulkCopy的实现

    本文主要介绍了mysql批量插入BulkCopy的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 利用rpm安装mysql 5.6版本详解

    利用rpm安装mysql 5.6版本详解

    众所周知MySQL在很多领域都被广泛的使用,尤其是很多互联网企业,诸如腾讯,阿里等等。那么本文将主要介绍如何通过rpm方式来安装Mysql,这是比较简单的一种安装方式,文中介绍的很详细,相信对于大家安装mysql具有一定的参考借鉴价值,下面来一起看看吧。
    2016-11-11
  • 解析如何使用Zend Framework 连接数据库

    解析如何使用Zend Framework 连接数据库

    本篇文章是对如何使用Zend Framework 连接数据库的方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • MySQL安装配置方法教程

    MySQL安装配置方法教程

    这篇文章主要为大家详细分享了MySQL安装配置方法教程,包括Linux/UNIX和Window系统上安装MySQL的具体步骤,感兴趣的朋友可以参考一下
    2016-05-05
  • Mysql数据库实现多字段过滤的方法

    Mysql数据库实现多字段过滤的方法

    这篇文章主要介绍了Mysql数据库实现多字段过滤的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • mysql server 5.5连接不上的解决方法

    mysql server 5.5连接不上的解决方法

    这篇文章主要为大家详细介绍了mysql server 5.5连接不上的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • MySQL8.0 锁等待排查的问题解决

    MySQL8.0 锁等待排查的问题解决

    MySQL 5.7 一些锁监控表,在 8.0 都发生了变化,本文主要介绍了MySQL8.0如何排查锁等待问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • Linux系统下修改mysql字符集为UTF8步骤

    Linux系统下修改mysql字符集为UTF8步骤

    大家好,本篇文章主要分享的是Linux系统下修改mysql字符集为UTF8步骤,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下吧,方便下次浏览
    2021-12-12
  • mysql语句性能分析工具之profiling用法

    mysql语句性能分析工具之profiling用法

    这篇文章主要介绍了mysql语句性能分析工具之profiling用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • MySQL获得当前日期时间函数示例详解

    MySQL获得当前日期时间函数示例详解

    这篇文章主要给大家介绍了关于MySQL获得当前日期时间函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论