MySQL desc extra 详解
1. 介绍

在MySQL中,desc(或describe)命令用于查看数据表的结构。通过使用desc命令,我们可以获取有关表中列的详细信息,例如列名、数据类型、键、 默认值和其他一些额外信息。其中,extra是desc命令的一个输出列,表示额外的列信息。
在本篇文章中,我们将详细介绍MySQL中desc命令的用法,并重点讨论extra列下的各种可能显示结果的含义。
2. desc 命令基本用法
在MySQL中,我们可以使用desc或describe命令来查看数据表的结构。它们的用法是完全相同的,你可以根据个人喜好来选择使用哪个命令。
下面是 desc 命令的基本语法:
desc table_name;
其中,table_name是我们想要查看结构的数据表的名称。
对于上述语法,我们需要将其输入到 MySQL 客户端或命令行工具中。以下是一个示例:
mysql> desc users;
运行上述命令后,MySQL 将返回一个表格,其中包含有关users表的结构信息。
3. desc 输出列
desc命令的输出包含以下列:
Field– 列的名称,表示数据表中的字段名。Type– 列的数据类型。Null– 列是否允许为空(YES或NO)。Key– 表示该列是否是键(PRI表示主键,UNI表示唯一键,MUL表示一般键,为空表示非键)。Default– 列的默认值。Extra– 列的额外信息。
本篇文章的重点是Extra列,下面将详细探讨它的各种可能显示结果的含义。
4. extra 列的含义
extra列提供了有关列的额外信息,它可以包含以下一些值:
auto_increment– 表示列是自增的,当插入数据时,这列的值会自动递增。on update CURRENT_TIMESTAMP– 表示列是一个timestamp类型,并且在更新数据时会自动更新为当前时间戳。DEFAULT_GENERATED– 表示列的默认值是通过一个生成表达式自动生成的。VIRTUAL GENERATED– 表示列是一个虚拟生成列,它不存储物理数据,而是根据其他列的值动态生成。STORED GENERATED– 表示列是一个存储生成列,它根据其他列的值动态生成,并将结果存储在表中。IDENTITY– 表示列是一个标识列,它由系统自动分配唯一的值。DEFAULT CHARSET=utf8mb4– 表示列的字符集是utf8mb4。
这些是extra列可能的值,下面将对每个值进行详细解释。
4.1 auto_increment
当一个列标记为auto_increment时,它将自动递增。这意味着当我们向表中插入数据时,不需要手动指定该列的值,它将自动增加。以下是一个示例:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
);
INSERT INTO users (name) VALUES ('Alice');
INSERT INTO users (name) VALUES ('Bob');
运行上述代码后,我们可以通过desc users;命令检查id列的extra值,可以看到它是auto_increment。
4.2 on update CURRENT_TIMESTAMP
如果一个列被标记为on update CURRENT_TIMESTAMP,那么它必须是一个timestamp类型的列。当对表中的行进行更新时,该列将自动更新为当前时间戳。以下是一个示例:
CREATE TABLE events (
id INT PRIMARY KEY,
name VARCHAR(50),
last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
INSERT INTO events (id, name) VALUES (1, 'Event 1');
UPDATE events SET name = 'Updated Event 1' WHERE id = 1;
在上述示例中,当我们更新events表中id为1的行时,last_updated列的值会自动更新为当前时间戳。
4.3 DEFAULT_GENERATED
当一个列的默认值是通过一个生成表达式来自动生成时,它的extra值将显示为DEFAULT_GENERATED。以下是一个示例:
CREATE TABLE messages (
id INT PRIMARY KEY,
content VARCHAR(100) DEFAULT (CONCAT('Message-', id))
);
INSERT INTO messages (id) VALUES (1);
在上述代码中,当我们向messages表中插入一行时,该行的content列将使用一个生成表达式自动生成默认值。这种情况下,content列的extra值将显示为DEFAULT_GENERATED。
4.4 VIRTUAL GENERATED
一个标记为VIRTUAL GENERATED的列是一个虚拟生成列。虚拟生成列是根据其他列的值动态生成的,并且不会存储在磁盘上。以下是一个示例:
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
price DECIMAL(10, 2),
discount_rate DECIMAL(4, 2),
discounted_price DECIMAL(10, 2) GENERATED ALWAYS AS (price - (price * discount_rate / 100)) VIRTUAL
);
INSERT INTO products (name, price, discount_rate) VALUES ('Product 1', 100, 10);
SELECT discounted_price FROM products;
在上述示例中,我们创建了一个名为products的表,其中包含discounted_price列,该列是一个虚拟生成列。该列根据price和discount_rate两列的值进行计算,并在查询时动态生成。运行上述代码后,我们可以通过desc products;命令查看discounted_price列的extra值,可以看到它是VIRTUAL GENERATED。
4.5 STORED GENERATED
标记为STORED GENERATED的列是一个存储生成列,它根据其他列的值动态生成,并将结果存储在表中。以下是一个示例:
CREATE TABLE salaries (
id INT PRIMARY KEY AUTO_INCREMENT,
basic_salary DECIMAL(10, 2),
allowances DECIMAL(10, 2),
total_salary DECIMAL(10, 2) GENERATED ALWAYS AS (basic_salary + allowances) STORED
);
INSERT INTO salaries (basic_salary, allowances) VALUES (1000, 200);
SELECT total_salary FROM salaries;
在上述示例中,我们创建了一个名为salaries的表,其中包含total_salary列,该列是一个存储生成列。该列根据basic_salary和allowances两列的值进行计算,并在插入数据时动态生成并存储结果。运行上述代码后,我们可以通过desc salaries;命令查看total_salary列的extra值,可以看到它是STORED GENERATED。
4.6 IDENTITY
一个标记为IDENTITY 的列是一个标识列,它由系统自动分配唯一的值。这在MySQL 8.0.19版本及以上被引入。以下是一个示例:
CREATE TABLE customers (
id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
name VARCHAR(50)
);
INSERT INTO customers (name) VALUES ('Customer 1');
在上述示例中,我们创建了一个名为customers的表,其中的id列被标记为IDENTITY,这意味着它将由系统自动生成唯一的值。我们可以通过desc customers;命令来查看id列的extra值,可以看到它是IDENTITY。
4.7 DEFAULT CHARSET=utf8mb4
DEFAULT CHARSET=utf8mb4 的extra值表示该列的字符集是utf8mb4。字符集决定了列中存储的字符编码方式,utf8mb4是一种支持存储任何Unicode字符的字符集。以下是一个示例:
CREATE TABLE messages (
id INT PRIMARY KEY,
content VARCHAR(100) DEFAULT CHARSET=utf8mb4
);
在上述示例中,我们创建了一个名为messages的表,其中的content列的字符集被设置为utf8mb4。我们可以通过desc messages;命令来查看content列的extra值,可以看到它是DEFAULT CHARSET=utf8mb4。
5. 结论
本文详细讲解了MySQL中desc命令中extra列的各种可能显示结果的含义。我们了解到,extra列提供了关于列的额外信息,如自增、自动更新、默认生成、虚拟生成、存储生成、标识列以及字符集等。通过理解这些extra值的含义,我们可以更好地理解和使用MySQL中的表结构。
极客笔记