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中的表结构。