【数据库初阶】MySQL中表的约束(下)

图片名称

??博主首页:

??专栏首页: 数据库初阶

??其它专栏: C++初阶 | C++进阶 | 初阶数据结构

在这里插入图片描述

亲爱的小伙伴们,大家好!在这篇文章中,我们将深入浅出地为大家讲解 MySQL中表的约束 帮助您轻松入门,快速掌握核心概念。

如果文章对您有所启发或帮助,请别忘了 点赞 ??、收藏 ??、留言 ?? 支持!您的每一份鼓励,都是我持续创作的源动力。让我们携手前行,共同进步!

文章目录

上一篇文章中,博主介绍了 :

  • MySQL中表的约束:

null / not null,

default,

comment,

zerofill,

primary key。

建议将上一篇文章看完之后再来看这篇文章,链接如下:

【数据库初阶】MySQL中表的约束(上)

那么接下来正文开始:

1. 自增长 AUTO_INCREMENT

1.1 基本概念

  • 当你插入数据到表中时,数据库会自动为指定的列生成一个唯一的、递增的整数值;
  • 无需在插入数据时显式指定这个值。这样可以避免人为错误或冲突,保证每行数据的唯一性。
  • 通常和主键和唯一键搭配使用,作为逻辑主键。

1.2 语法格式

  • 定义 AUTO_INCREMENT 的列时,通常会配合 主键或唯一键 使用。以下是创建表时使用 AUTO_INCREMENT 的示例:

    CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    position VARCHAR(100)
    );

  • 在这个例子中,id 列被设置为 AUTO_INCREMENT,这意味着每次插入一条新记录时,id 会自动递增。

1.3 插入数据

  • 在插入数据时,如果不指定 AUTO_INCREMENT 列的值,数据库会自动为该列生成递增的值,且自增列的初始值默认为 1 1 1,例如:

    INSERT INTO employees (name, position) VALUES (‘John Doe’, ‘Manager’);
    INSERT INTO employees (name, position) VALUES (‘Jane Smith’, ‘Developer’);

在这里插入图片描述

1.3.1 自增的行为
  • 查看AUTO_INCREMENT的值:我们可以用 show create table tb_name 查看,例如:

在这里插入图片描述

  • 初始值:自增列的初始值默认为 1 1 1,但可以通过设置表的 AUTO_INCREMENT 属性来更改初始值,例如:(ALTER语句)

    ALTER TABLE employees AUTO_INCREMENT = 100;

在这里插入图片描述

  • 手动插入指定值:如果下次插入指定 id 的值,有两种情况,一种是比现在的值小,另一种是比现在的值大
    • 如果小,并且没有冲突,就直接插入,但是 AUTO_INCREMENT值不变;
    • 如果大,插入之后,AUTO_INCREMENT值变为这个值的后一个,例如:

在这里插入图片描述

  • 删除记录后的影响:删除记录并不会自动回收被删除记录的自增值。即使删除了某个 ID,新的记录仍然会从上次生成的最大值后继续递增。

在这里插入图片描述

  • 可以用函数 last_insert_id 查看上一次插入的 auto_increment 的值:

在这里插入图片描述

1.3.2 MySQL 中的一些注意事项
  • 每个表只能有一个 AUTO_INCREMENT 列。
  • 默认情况下,AUTO_INCREMENT 列的数据类型通常是整数类型,如 INTBIGINT,不过也可以使用其他数值类型。
  • 在一个表中,如果有多个列是联合主键,那么只能有一个列是 AUTO_INCREMENT

2. 唯一键 UNIQUE KEY

2.1 基本概念

  • 唯一性:唯一键确保每一行数据在指定的列(或列组合)中是唯一的,即不允许存在两个或更多相同的值。
  • NULL 值:与主键不同,唯一键允许列中有 NULL 值。多个 NULL 值在唯一键列中是允许的(这与主键不同,主键列不允许有 NULL 值)。

2.2 语法格式

唯一键可以通过 UNIQUE 关键字在创建表时定义,或者在已经存在的表中使用 ALTER TABLE 来添加。

2.2.1 创建表时使用唯一键
CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,  -- 主键
    email VARCHAR(255) UNIQUE,  -- 唯一键
    name VARCHAR(100),
    UNIQUE(name) --也可以这样定义
);

在这里插入图片描述

在这个例子中,email 列被定义为唯一键,这意味着每个 email 地址在 employees 表中必须是唯一的。

2.2.2 添加唯一键到已有表中
ALTER TABLE employees ADD CONSTRAINT unique_email UNIQUE (email); 
-- constraint 的意思是给唯一键取别名,
-- 这里的别名是 unique_email,可以省略

这条语句将 email 列添加一个唯一约束,确保该列中的值不会重复。

2.2.3 使用多个列作为唯一键
  • 还可以使用 多个列的组合来作为唯一约束,这在需要确保某些列组合的唯一性时非常有用。

  • 例如,确保某个表中用户的 first_namelast_name 组合是唯一的:

    CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    first_name VARCHAR(100),
    last_name VARCHAR(100),
    email VARCHAR(255),
    UNIQUE (first_name, last_name)
    );

  • 在这个例子中,first_namelast_name 列的组合必须唯一。

  • 即使某个员工的 first_namelast_name 中的一个与另一个员工相同,只要 id 不同,也不会违反唯一约束。

2.3 唯一键 vs 主键

尽管主键(PRIMARY KEY)和唯一键(UNIQUE KEY)都确保列中的值唯一,但它们之间有以下差异:

  • NULL 值:主键列不允许 NULL 值,而唯一键列允许 NULL 值。多个 NULL 值在唯一键列中是允许的。
  • 每表只能有一个主键:一个表只能有一个主键,主键通常用于标识表中的每一行数据。
  • 多个唯一键:一个表可以有多个唯一键约束。例如,在一个表中,emailphone_number 列都可以是唯一键。
  • 主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息
    出现重复。

3. 外键 FOREIGN KEY

  • 外键用于建立和维护两张表之间的关系。外键约束确保了一张表中的某个字段(或字段组合)对应另一张表中的 主键或唯一键 字段的值,从而保持数据的完整性和一致性。
  • 外键约束通常用于表示两张表之间的父子关系(即一对多关系或多对多关系)。它帮助确保在子表中的数据值只能是父表中已经存在的合法值,防止子表中插入无效或错误的引用数据。

3.1 基本概念

  • 父表:拥有主键或唯一键的表,通常是被引用的表。
  • 子表:引用父表中的主键或唯一键的表,通常包含外键约束的字段。
  • 外键列:在** 子表 **中,作为外键的列(或列组合),指向父表的主键或唯一键。

在这里插入图片描述

3.2 语法格式

3.2.1 创建表时定义外键

在创建子表时,可以直接定义外键约束:

CREATE TABLE orders (
    order_id INT AUTO_INCREMENT PRIMARY KEY,
    customer_id INT,
    order_date DATE,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
  • 在这个例子中:orders 表中的 customer_id 列是外键,它引用 customers 表中的 customer_id 列。
  • FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 这部分定义了外键约束,确保 orders 表中的 customer_id 必须是 customers 表中已存在的 customer_id 值。
3.2.2 外键示例

假设我们有两个表:`customers` 和 `orders`。

CREATE TABLE customers (
    customer_id INT AUTO_INCREMENT PRIMARY KEY,
    customer_name VARCHAR(100)
);

CREATE TABLE orders (
    order_id INT AUTO_INCREMENT PRIMARY KEY,
    customer_id INT,
    order_date DATE,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id) 
);

在这个结构中:

  • customers 表是父表,包含每个客户的信息。
  • orders 表是子表,包含订单信息,其中每个订单都与一个客户相关联,customer_id 是外键,引用 customers 表中的 customer_id
3.2.3 插入数据

首先插入一些客户数据:

INSERT INTO customers (customer_name) VALUES ('Alice');
INSERT INTO customers (customer_name) VALUES ('Bob');

接着插入订单数据:

INSERT INTO orders (customer_id, order_date) VALUES (1, '2025-01-01');
INSERT INTO orders (customer_id, order_date) VALUES (2, '2025-01-02');

此时,orders 表中的每一条记录都与 customers 表中的客户对应。如果你尝试插入一个不存在的 customer_id,会报错:

INSERT INTO orders (customer_id, order_date) VALUES (3, '2025-01-03');