MYSQL:表的操作

文章目录

  • MYSQL:表的操作
    • [1. 本文简述](#1. 本文简述)
    • [2. 查看所有表](#2. 查看所有表)
      • [2.1 语法](#2.1 语法)
    • [3. 创建表](#3. 创建表)
      • [3.1 语法](#3.1 语法)
      • [3.2 示例](#3.2 示例)
      • [3.3 表在磁盘上对应的文件](#3.3 表在磁盘上对应的文件)
      • [3.4 创建表时使用 `IF NOT EXISTS`](#3.4 创建表时使用 IF NOT EXISTS)
    • [4. 查看表结构](#4. 查看表结构)
      • [4.1 语法](#4.1 语法)
      • [4.2 示例](#4.2 示例)
    • [5. 修改表](#5. 修改表)
      • [5.1 语法](#5.1 语法)
      • [5.2 示例](#5.2 示例)
        • [5.2.1 向表中添加一列](#5.2.1 向表中添加一列)
        • [5.2.2 修改列的定义](#5.2.2 修改列的定义)
        • [5.2.3 重命名列](#5.2.3 重命名列)
        • [5.2.4 删除某个字段](#5.2.4 删除某个字段)
        • [5.2.5 修改表名](#5.2.5 修改表名)
    • [6. 删除表](#6. 删除表)
      • [6.1 语法](#6.1 语法)
      • [6.2 示例](#6.2 示例)
      • [6.3 注意事项](#6.3 注意事项)

MYSQL:表的操作

1. 本文简述

在之前的文章中,我们学会了如何操作数据库本身。今天,我们把目光聚焦到数据库内部的核心------数据表。希望本文能够让你掌握数据表的"增删改查"四大基本功,也就是如何创建、查看、修改和删除一张表。

2. 查看所有表

当我们进入一个数据库后,第一步往往是想看看里面到底有哪些表。这时候,一个非常直观的命令就派上用场了。

2.1 语法

sql 复制代码
-- 这个命令会列出当前所在数据库中的所有表
show tables;

3. 创建表

表是数据库中存放数据的基本单位,也是我们打交道最多的对象。可以把它理解为一个结构化的数据容器,就像一张规定好了列(字段)的表格,我们之后的数据都会一行一行地存放在里面。

3.1 语法

创建表的通用语法如下:

sql 复制代码
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name (
    field_name datatype [CONSTRAINTS] [COMMENT '注解内容'],
    field_name datatype [CONSTRAINTS] [COMMENT '注解内容'],
    ...
) [ENGINE=存储引擎] [CHARACTER SET=字符集] [COLLATE=排序规则];

这个语法看起来选项很多,我们来逐一拆解一下其中的关键部分:

  • TEMPORARY: 加上它,创建的就是一个临时表。这种表只在当前的数据库会话中有效,一旦会话结束,它就会被自动删除,非常适合用在一些临时的计算场景。
  • IF NOT EXISTS: 这是一个非常有用的防御性编程技巧。它告诉 MySQL:"只有在不存在同名表的情况下才创建"。这样可以有效避免因表已存在而导致的执行错误。
  • field_name: 定义列的名称,也就是我们常说的"字段名"。
  • datatype: 指定这一列用来存储什么类型的数据,例如整数 INT、字符串 VARCHAR(50) 等。
  • CONSTRAINTS: 为列添加约束,比如 NOT NULL (代表该列必须有值)、PRIMARY KEY (主键)等。关于约束的详细内容,我们会在后续的章节深入探讨。
  • COMMENT: 为列添加注释。这是一个非常好的习惯,清晰的注释能让其他开发者(以及未来的自己)快速理解每个字段的用途。
  • ENGINE: 指定表的存储引擎,比如我们常用的 InnoDBMyISAM。如果不指定,MySQL 会使用默认的存储引擎(在现代版本中通常是 InnoDB)。
  • CHARACTER SET: 指定表数据的默认字符集,例如 utf8mb4,它能很好地支持包括 Emoji 在内的各种字符。
  • COLLATE: 指定字符集的排序和比较规则,例如 utf8mb4_0900_ai_ci

如果想了解所有细节,随时可以查阅官方文档:
https://dev.mysql.com/doc/refman/8.0/en/create-table.html

3.2 示例

理论说完了,我们来动手实践一下。

  • 创建一个基础的用户表

    我们来创建一个名为 users 的表,包含用户ID、用户名、密码和生日,并为其指定推荐的 utf8mb4 字符集。

    sql 复制代码
    -- 创建一个名为 users 的表,并为每个字段添加注释
    CREATE TABLE users (
        id BIGINT COMMENT '用户唯一ID',
        name VARCHAR(20) COMMENT '用户名',
        password CHAR(32) COMMENT '密码,通常存储32位的MD5摘要',
        birthday DATE COMMENT '生日'
    ) CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci;
  • 创建一个指定存储引擎的表

    如果我们有特殊需求,比如需要使用 MyISAM 存储引擎,可以在创建时显式指定。

    sql 复制代码
    -- 创建一个使用 MyISAM 存储引擎的表
    CREATE TABLE t_myisam (
        id BIGINT,
        name VARCHAR(20) COMMENT '用户名'
    ) ENGINE = MyISAM;

3.3 表在磁盘上对应的文件

我们用 SQL 创建了一张表,那么它在我们的电脑硬盘上究竟是以什么形式存在的呢?这和表的存储引擎密切相关。

  • InnoDB 存储引擎 : 作为 MySQL 的默认存储引擎,InnoDB 的管理方式比较简洁。通常,它会为每张表在数据库对应的文件夹下创建一个名为 表名.ibd 的文件。这个 .ibd 文件就像一个打包好的盒子,里面既包含了表的结构定义,也包含了表里的所有行数据。

在我的电脑里 MySQL 的数据目录 (datadir)

sql 复制代码
#使用SQL命令查看目录,并找到数据库名称命名的子文件夹
SHOW VARIABLES LIKE 'datadir';
  • MyISAM 存储引擎 : 相比之下,MyISAM 引擎会将一张表的信息拆分成三个文件存放:

    • 表名.MYD (MYData): 这个文件专门用来存放表的所有数据行
    • 表名.MYI (MYIndex): 这个文件则负责存储表的索引信息,用于加速查询。
    • 表名.sdi (Serialized Dictionary Information): 在 MySQL 8.0 及更新的版本中,这是一个包含表元数据(比如表结构定义)的 JSON 格式文件。而在较早的版本中,这些元数据信息是存放在一个叫 表名.frm 的文件里的。

    这是上文创建的 MyISAM 存储引擎的t_myisam表对应的文件

3.4 创建表时使用 IF NOT EXISTS

如果在写脚本或程序时,重复执行创建表的语句,会发生什么呢?

sql 复制代码
-- 尝试创建一个已经存在的 'users' 表
create table users (
    id int,
    name varchar(20)
);
-- MySQL会直接报错,提示表已存在
ERROR 1050 (42S01): Table 'users' already exists

为了避免这种情况中断我们的程序,IF NOT EXISTS 就派上用场了。它就像一个安全阀,正如我们之前在操作数据库时学到的那样。

sql 复制代码
-- 使用 IF NOT EXISTS 可以避免因表已存在而报错
create table if not exists users (
    id int,
    name varchar(20)
);
-- 这次,MySQL 不会报错,而是返回一个警告
Query OK, 0 rows affected, 1 warning (0.01 sec)

-- 我们可以通过 show warnings; 查看警告的具体内容
show warnings;

这种方式让我们的 SQL 脚本健壮性更强,尤其在需要重复执行的自动化任务中非常实用。

4. 查看表结构

表创建好了,有时候我们想确认一下它的结构是否正确,或者忘记了某个字段的具体定义,就需要查看表结构。

4.1 语法

sql 复制代码
-- DESC 是 DESCRIBE 的缩写,两者功能完全一样
DESC table_name;

4.2 示例

sql 复制代码
desc users;

我们来看看这个结果中每一列的含义:

  • Field: 列名。
  • Type: 该列的数据类型。
  • Null: 表示该列是否允许存储 NULL 值。YES 代表允许,NO 则代表不允许。
  • Key: 该列的索引类型。例如,PRI 表示它是主键 (Primary Key)。
  • Default: 如果插入新数据时没有为该列指定值,它会使用的默认值。
  • Extra: 一些额外的信息,比如 auto_increment 表示该列是自增的。

5. 修改表

在软件开发中,需求变更是家常便饭。因此,对已经创建好的表结构进行调整也是一项必备技能。我们可能需要增加一个新字段,修改现有字段的类型,或者删除一个不再需要的字段。ALTER TABLE 命令就是我们完成这些任务的利器。

5.1 语法

ALTER TABLE 的基本语法结构如下:

sql 复制代码
ALTER TABLE tbl_name [alter_option [, alter_option] ...];

这里的 alter_option 就是我们具体要做的修改操作,常见的有:

sql 复制代码
-- 添加新的一列
ADD [COLUMN] col_name column_definition [FIRST | AFTER other_col_name]

-- 修改现有列的定义(比如数据类型、约束等)
MODIFY [COLUMN] col_name new_column_definition [FIRST | AFTER other_col_name]

-- 删除一列
DROP [COLUMN] col_name

-- 重命名一列
RENAME COLUMN old_col_name TO new_col_name

-- 重命名整张表
RENAME [TO | AS] new_tbl_name

想了解更全面的修改选项,可以查阅官方文档:
https://dev.mysql.com/doc/refman/8.0/en/alter-table.html

5.2 示例

下面我们通过一些操作,来熟悉 ALTER TABLE 的用法。

5.2.1 向表中添加一列

假设业务升级,需要为用户增加一个存储头像地址的功能。我们可以在 birthday 字段后面添加一个 avatar 字段。

sql 复制代码
-- 使用 ADD ... AFTER ... 来指定新列的位置
alter table users ADD avatar varchar(255) comment '头像地址' after birthday;

-- 查看修改后的表结构
desc users;
5.2.2 修改列的定义

随着用户量的增长,我们发现 name 字段的 varchar(20) 长度可能不够用,需要将其扩展到 50

sql 复制代码
-- 使用 MODIFY 来修改现有列的定义
alter table users MODIFY name varchar(50);

-- 查看结果,可以看到 name 字段的类型已经改变
desc users;
5.2.3 重命名列

出于规范考虑,我们想把 birthday 列统一命名为 birth_date

sql 复制代码
-- 使用 RENAME COLUMN ... TO ... 来重命名
alter table users RENAME COLUMN birthday TO birth_date;

-- 查看结果
desc users;
5.2.4 删除某个字段

后来发现 avatar 这个功能暂时不上了,我们可以将这个字段从表中移除。

sql 复制代码
-- 使用 DROP 来删除列
alter table users DROP avatar;

-- 再次查看表结构,avatar 列已经消失了
desc users;
5.2.5 修改表名

如果 users 这个表名不够贴切,比如它实际上存的是员工信息,我们可以把它重命名为 employees

sql 复制代码
-- 使用 RENAME TO 来修改表名
alter table users RENAME TO employees;

-- 查看当前数据库的所有表,确认 users 已经变成了 employees
show tables;

小提示: 还有另一种重命名表的语法 RENAME TABLE old_table_name TO new_table_name;。这种方式功能更强大,甚至可以一次性为多张表重命名。

6. 删除表

删除表是一个高危操作。一旦执行,不仅是表结构,里面存储的所有数据都会被永久性地、不可恢复地删除。

6.1 语法

sql 复制代码
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ...
  • IF EXISTS: 同样是我们的安全网,可以避免因尝试删除一个不存在的表而导致脚本报错。
  • 这个命令支持一次性删除多张表,只需将表名用逗号隔开即可。

6.2 示例

sql 复制代码
-- 使用 IF EXISTS 安全地删除 employees 表
drop table if exists employees;

-- 也可以同时删除多张表
drop table if exists t_myisam;

-- 查看所有表,确认它们都已被删除
show tables;

6.3 注意事项

  • 删除表是不可逆的,请务必谨慎操作! 在生产环境中,执行此操作前一定要再三确认,并确保有数据备份。
  • 删除表成功后,其在磁盘上对应的物理文件(如 .ibd 文件)也会被一并删除。
相关推荐
云边散步1 小时前
第6篇:《JOIN 是红娘,帮你配对多张表!》
mysql
inrgihc1 小时前
基于MySQL实现分布式调度系统的选举算法
数据库·mysql·算法
胡耀超2 小时前
Oracle数据库索引性能机制深度解析:从数据结构到企业实践的系统性知识体系
数据结构·数据库·oracle·dba·b+树·索引
jnrjian2 小时前
dataguard dg broker
数据库·oracle
一只fish2 小时前
MySQL 8.0 OCP 1Z0-908 题目解析(31)
数据库·mysql
AirMan4 小时前
面试官问你 MySQL 的线上执行 DDL 该怎么做?4 种方案多角度回答!
后端·mysql
都叫我大帅哥4 小时前
MySQL MVCC 深度揭秘:多版本并发控制的魔法与陷阱
mysql
JeffreyGu.5 小时前
【Oracle】Oracle 11g打补丁时遇到opatch apply命令无法识别
数据库·oracle
七夜zippoe5 小时前
PostgreSQL 终端命令详解及实际应用案例
数据库·postgresql·oracle
JVM高并发5 小时前
MySQL 中处理 JSON 数组并为每个元素拼接字符串
后端·mysql