本篇我们就来介绍MySQL中表相关的操作
目录
[查看表列表(SHOW TABLES)](#查看表列表(SHOW TABLES))
[查看表结构(DESCRIBE / SHOW COLUMNS)](#查看表结构(DESCRIBE / SHOW COLUMNS))
[查看创建表语句(SHOW CREATE TABLE)](#查看创建表语句(SHOW CREATE TABLE))
[查看表状态(SHOW TABLE STATUS)](#查看表状态(SHOW TABLE STATUS))
表
在MySQL这样的关系型数据库管理系统(RDBMS)中,表(Table) 是数据存储的核心逻辑单元,也是我们日常操作中最常打交道的对象
MySQL 遵循关系模型理论,表是"关系"的具体实现。从用户视角看,它是一个二维结构:
行(Row):也称记录(Record),代表一个实体的具体实例。例如,一张员工表中的每一行对应一位具体的员工。
列(Column):也称字段(Field),代表实体的一种属性。例如,员工表中的"姓名"、"工号"、"部门"等列。
表的组成要素
列定义(Schema)
每一列都有明确的定义,包括:
-
列名:在同一表中唯一,通常遵循小写加下划线的命名规范。
-
数据类型 :规定该列能存储什么类型的值,如
INT(整数)、VARCHAR(n)(可变长字符串)、DATE(日期)、DECIMAL(精确小数)等。选择合适的数据类型对性能至关重要。 -
约束(Constraints):对列的值施加规则,保证数据完整性。
-
NOT NULL:禁止空值。 -
DEFAULT:指定默认值。 -
PRIMARY KEY:主键,唯一标识一行。 -
UNIQUE:列值必须唯一。 -
FOREIGN KEY:外键,引用另一张表的主键,维护参照完整性。 -
CHECK:检查条件(MySQL 8.0+ 支持)。
-
-
其他属性 :如
AUTO_INCREMENT(自动递增)、COMMENT(注释)等。
行数据
行是实际存储的数据记录。MySQL 将行数据按照表的定义格式存储在磁盘上(或内存中)。每行都有一个隐式的行ID(除非有主键),用于内部管理。
表的元数据与物理属性
除了列和行,表还拥有一系列元数据,控制其行为和物理存储。
存储引擎
MySQL 采用插件式存储引擎架构,表可以由不同的引擎管理。最常用的引擎是 InnoDB (默认),它支持事务、行级锁、外键和崩溃恢复。其他引擎如 MyISAM (不支持事务,表级锁,适合只读或日志型应用)、MEMORY (数据存于内存,速度快但易失)等。创建表时可通过 ENGINE=InnoDB 指定。
字符集与校对规则
表可以设置默认的字符集和校对规则,该设置将作为表中字符串类型列(如 CHAR, VARCHAR, TEXT)的默认值。例如:
sql
CREATE TABLE t (name VARCHAR(50)) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
索引
索引是提高查询效率的数据结构,与表紧密相关。MySQL 使用 B+树(InnoDB)或哈希(MEMORY)等结构实现索引。索引可以建在一列或多列上,有普通索引、唯一索引、全文索引、空间索引等类型。创建索引的语句:
sql
CREATE INDEX idx_name ON t (name);
索引在逻辑上属于表,但在物理上与表数据分开存储(但 InnoDB 的聚簇索引将数据和主键索引存储在一起)。
分区
对于超大型表,MySQL 支持分区表,即将一张表的数据按规则(如范围、列表、哈希)分散存储在不同的物理分区中,但逻辑上仍是一张表。这有助于管理、备份和查询性能。
表空间
InnoDB 引擎将表数据和索引存储在表空间(tablespace)中。默认情况下,每张表对应一个独立的 .ibd 文件(独立表空间),也可以使用通用表空间。这是物理层面的概念,但对用户透明。
表的类型
普通表:永久存储数据的基础表。
临时表 :使用 CREATE TEMPORARY TABLE 创建,只在当前会话可见,会话结束自动删除,常用于复杂查询的中间结果存储。
派生表:查询中由子查询生成的虚拟表,仅存在于查询执行期间。
视图(View):虽然名字中有"表",但视图是虚拟表,不存储数据,只存储定义(SELECT 语句),对视图的查询会被重写为对基表的查询。
创建表
表达式
sql
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition, ...)
[table_options]
[partition_options]
-
create_definition:列定义、索引、约束等。 -
table_options:表级选项,如引擎、字符集、注释等。 -
partition_options:分区选项(高级)。
核心参数解析
-
列定义:
sqlcol_name data_type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [PRIMARY KEY] [COMMENT 'string']-
data_type:如INT,VARCHAR(50),DATE等。 -
NOT NULL:不允许空值。 -
DEFAULT:指定默认值。 -
AUTO_INCREMENT:自动增长,通常用于主键。 -
COMMENT:列注释。
-
-
约束:
-
PRIMARY KEY (col1, col2):主键。 -
UNIQUE KEY (col):唯一约束。 -
FOREIGN KEY (col) REFERENCES parent_tbl (parent_col):外键(需 InnoDB)。 -
CHECK (expr):检查约束(MySQL 8.0+ 支持)。
-
-
索引 :
{INDEX | KEY} [index_name] (col_list),可加速查询。 -
表选项:
-
ENGINE = storage_engine:指定存储引擎,如InnoDB(默认)、MyISAM。 -
AUTO_INCREMENT = n:设置自增起始值。 -
DEFAULT [CHARACTER SET | CHARSET] = charset_name:默认字符集。 -
COLLATE = collation_name:默认校对规则。 -
COMMENT = 'string':表注释。 -
ROW_FORMAT = {DEFAULT | DYNAMIC | FIXED | COMPRESSED | REDUNDANT | COMPACT}:行格式。
-
-
分区选项 :
PARTITION BY ...,用于将大表分割为多个物理部分。
修改表
表达式
sql
ALTER TABLE tbl_name
[alter_option [, alter_option] ...]
其中 alter_option 可以是多种操作,如添加列、修改列、删除列、重命名表、修改表选项等。
核心参数解析
-
添加列 :
ADD [COLUMN] col_name definition [FIRST | AFTER col_name] -
删除列 :
DROP [COLUMN] col_name -
修改列定义:
-
MODIFY [COLUMN] col_name new_definition [FIRST | AFTER col_name](保留列名) -
CHANGE [COLUMN] old_col_name new_col_name definition(可同时改名)
-
-
重命名表 :
RENAME [TO | AS] new_tbl_name -
添加/删除约束:
-
ADD PRIMARY KEY (col_list) -
DROP PRIMARY KEY -
ADD FOREIGN KEY ... -
DROP FOREIGN KEY fk_name
-
-
添加/删除索引:
-
ADD INDEX index_name (col_list) -
DROP INDEX index_name
-
-
修改表选项 :如
ENGINE=InnoDB、AUTO_INCREMENT=100、COMMENT 'new comment'等。 -
其他 :
ENABLE/DISABLE KEYS(用于 MyISAM 批量插入优化),RENAME INDEX old_name TO new_name(MySQL 8.0+)等。
查看表
查看表列表(SHOW TABLES)
-
表达式:
sqlSHOW [FULL] TABLES [FROM db_name] [LIKE 'pattern' | WHERE expr] -
参数:
-
FULL:显示表类型(BASE TABLE 或 VIEW)。 -
FROM:指定数据库,默认为当前库。 -
LIKE:模式匹配表名。 -
WHERE:条件过滤(MySQL 5.7.6+)。
-
-
示例:
sqlSHOW TABLES FROM mydb LIKE 'emp%';
查看表结构(DESCRIBE / SHOW COLUMNS)
-
表达式:
sql{DESCRIBE | DESC} tbl_name [col_name | LIKE 'pattern'] SHOW COLUMNS FROM tbl_name [FROM db_name] [LIKE 'pattern' | WHERE expr] -
参数 :
SHOW COLUMNS支持FULL显示额外信息(如权限、注释)。 -
示例:
sqlDESC employees; SHOW FULL COLUMNS FROM employees;
查看创建表语句(SHOW CREATE TABLE)
-
表达式:
sqlSHOW CREATE TABLE tbl_name -
示例:
sqlSHOW CREATE TABLE employees\G (\G 纵向显示,美观)
查看表状态(SHOW TABLE STATUS)
-
表达式:
sqlSHOW TABLE STATUS [FROM db_name] [LIKE 'pattern' | WHERE expr] -
参数:显示表的详细信息,如引擎、行数(近似)、数据长度、索引长度、创建时间等。
-
示例:
sqlSHOW TABLE STATUS FROM mydb WHERE Name = 'employees';
清空表
表达式
sql
TRUNCATE [TABLE] tbl_name
说明
-
快速删除表中所有数据,并重置自增值(相当于 DROP + CREATE,但更快)。
-
属于 DDL 操作,不可回滚。
-
对于 InnoDB,如果是基于全局共享表空间,重置自增值;如果是独立表空间,效果类似。
简单示例
sql
TRUNCATE TABLE employees; -- 清空数据,表结构保留
删除表
表达式
sql
DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... [RESTRICT | CASCADE]
参数解析
-
TEMPORARY:只删除临时表。 -
IF EXISTS:防止因表不存在而报错(会生成警告)。 -
RESTRICT | CASCADE:在 MySQL 中无实际效果(仅为语法兼容),可忽略。
简单示例
sql
DROP TABLE IF EXISTS temp_employees;
本期内容介绍到这里了。
封面图自取:
