MySQL desc extra 详解

MySQL desc extra 详解

1. 介绍

MySQL desc extra 详解

在MySQL中,desc(或describe)命令用于查看数据表的结构。通过使用desc命令,我们可以获取有关表中列的详细信息,例如列名、数据类型、键、 默认值和其他一些额外信息。其中,extradesc命令的一个输出列,表示额外的列信息。

在本篇文章中,我们将详细介绍MySQL中desc命令的用法,并重点讨论extra列下的各种可能显示结果的含义。

2. desc 命令基本用法

在MySQL中,我们可以使用descdescribe命令来查看数据表的结构。它们的用法是完全相同的,你可以根据个人喜好来选择使用哪个命令。

下面是 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列,该列是一个虚拟生成列。该列根据pricediscount_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_salaryallowances两列的值进行计算,并在插入数据时动态生成并存储结果。运行上述代码后,我们可以通过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=utf8mb4extra值表示该列的字符集是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中的表结构。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程