
MySQL学习:
https://blog.csdn.net/2301_80220607/category_12971838.html?spm=1001.2014.3001.5482
前言:
在上一篇我们学习了库的创建和使用,表是其存储数据的核心结构。本文将全面讲解MySQL中关于表的各项操作,包括创建、修改、删除等,并深入探讨相关知识点和注意事项。
在MySQL中,表是存储数据的主要对象,由行和列组成。理解表的基本结构对数据库设计至关重要。
组成部分 | 描述 |
|---|---|
表名 | 表的唯一标识符,遵循命名规则 |
列(字段) | 表的垂直结构,定义数据的类型和约束 |
行(记录) | 表的水平结构,实际存储的数据 |
主键 | 唯一标识表中每一行的列或列组合 |
索引 | 提高查询性能的数据结构 |
约束 | 保证数据完整性的规则 |

CREATE TABLE [IF NOT EXISTS] table_name (
column1 datatype [constraints] [COMMENT 'column_comment'],
column2 datatype [constraints] [COMMENT 'column_comment'],
...,
[table_constraints]
)
[ENGINE=storage_engine]
[CHARACTER SET charset]
[COLLATE collation]
[COMMENT 'table_comment']
[PARTITION BY partition_type (partition_expression)];语法各部分详细说明:
column1, column2:列名(字段名)
datatype:列的数据类型(如INT, VARCHAR等)
[constraints]:可选的列约束(如NOT NULL, UNIQUE等)
[COMMENT]:可选的列注释
参数 | 描述 | 示例 | 注意事项 |
|---|---|---|---|
IF NOT EXISTS | 避免表已存在时报错 | CREATE TABLE IF NOT EXISTS users | 不会检查表结构是否相同 |
列定义 | 列名+数据类型+约束 | username VARCHAR(50) NOT NULL COMMENT '用户登录名' | 列名不能重复 |
数据类型 | 定义列存储的数据类型 | INT, VARCHAR(255), DECIMAL(10,2) | 选择最合适的数据类型 |
列约束 | 限制列中数据的规则 | NOT NULL, UNIQUE, DEFAULT 'value' | 约束越多,性能开销越大 |
表级约束 | 应用于整个表的约束 | PRIMARY KEY (id), FOREIGN KEY (dept_id) REFERENCES departments(id) | 复合主键必须在此定义 |
存储引擎 | 指定表的存储引擎 | ENGINE=InnoDB | MySQL 5.5+默认InnoDB |
字符集 | 指定表的默认字符集 | CHARACTER SET utf8mb4 | 推荐utf8mb4支持完整Unicode |
排序规则 | 指定字符比较规则 | COLLATE utf8mb4_general_ci | _ci表示不区分大小写 |
注释 | 为表或列添加描述 | COMMENT '员工基本信息表' | 有助于文档化 |
MySQL支持多种数据类型,主要分为几大类:
数值类型:
字符串类型:
日期时间类型:
其他类型:
约束类型 | 语法 | 描述 | 示例 |
|---|---|---|---|
NOT NULL | col_name datatype NOT NULL | 列不能存储NULL值 | name VARCHAR(50) NOT NULL |
UNIQUE | col_name datatype UNIQUE | 列中所有值必须不同 | email VARCHAR(100) UNIQUE |
PRIMARY KEY | PRIMARY KEY (col1, col2) | 唯一标识表中每行 | id INT AUTO_INCREMENT PRIMARY KEY |
FOREIGN KEY | FOREIGN KEY (col) REFERENCES table(col) | 强制引用完整性 | FOREIGN KEY (dept_id) REFERENCES departments(id) |
CHECK | CHECK (condition) | 确保列值满足条件 | salary DECIMAL CHECK (salary > 0) |
DEFAULT | col_name datatype DEFAULT value | 未指定值时使用默认值 | created_at TIMESTAM |
建立一个学生表student
CREATE TABLE Student
(Sno CHAR(8) PRIMARY KEY, /*列级完整性约束条件,Sno是主码*/
Sname VARCHAR(20) UNIQUE, /*sname取唯一值*/
Ssex CHAR(6),
Sbirthdate Date,
Smajor VARCHAR(40)
)character set utf8 engine MyISAM;
建立一个员工表,这个比较复杂,涉及到约束问题,简单看一下了解一下就行,后面会针对约束问题专门开一篇
CREATE TABLE IF NOT EXISTS employees (
emp_id INT AUTO_INCREMENT COMMENT '员工ID,自动递增',
first_name VARCHAR(50) NOT NULL COMMENT '名字',
last_name VARCHAR(50) NOT NULL COMMENT '姓氏',
email VARCHAR(100) UNIQUE COMMENT '邮箱地址,唯一',
hire_date DATE NOT NULL COMMENT '入职日期',
salary DECIMAL(10,2) CHECK (salary > 0) COMMENT '薪水,必须大于0',
dept_id INT COMMENT '部门ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录最后更新时间',
-- 表级约束
PRIMARY KEY (emp_id),
INDEX idx_name (last_name, first_name) COMMENT '姓名组合索引',
CONSTRAINT fk_dept FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
)
ENGINE=InnoDB
CHARACTER SET=utf8mb4
COLLATE=utf8mb4_unicode_ci
COMMENT='公司员工信息表';关于索引和表的约束的问题,我们留在后面几篇细讲,下面出现的所有的关于索引和表的约束的问题都可以先忽略
show tables;通过这个我们可以查看我们当前所在的数据库中都有哪些表

desc 表名;而这个语句则能帮助我们直接查看指定的数据表的结构

随着需求变化,经常需要修改已有表的结构。
操作类型 | 语法示例 | 说明 | 注意事项 | |
|---|---|---|---|---|
添加列 | ALTER TABLE table ADD COLUMN col_name datatype [constraints] [AFTER existing_col] | 添加新列 | 大表操作可能耗时 | |
修改列 | ALTER TABLE table MODIFY COLUMN col_name new_datatype [constraints] | 修改列定义 | 数据类型变更可能导致数据丢失 | |
重命名列 | ALTER TABLE table CHANGE COLUMN old_name new_name datatype [constraints] | 修改列名和定义 | 必须包含数据类型 | |
删除列 | ALTER TABLE table DROP COLUMN col_name | 删除现有列 | 不可逆操作 | |
添加约束 | ALTER TABLE table ADD CONSTRAINT constraint_name constraint_def | 添加主键、外键等 | 外键需确保数据一致 | |
删除约束 | ALTER TABLE table DROP CONSTRAINT constraint_name | 删除约束 | 主键约束名为PRIMARY | |
重命名表 | ALTER TABLE old_name RENAME TO new_name 或 RENAME TABLE old_name TO new_name | 修改表名 | 需更新相关视图、存储过程 | |
修改引擎 | ALTER TABLE table ENGINE=InnoDB | 更改存储引擎 | 可能锁表 | |
添加索引 | ALTER TABLE table ADD INDEX idx_name (col1, col2) | 添加普通索引 | 避免重复索引 | |
添加全文索引 | ALTER TABLE table ADD FULLTEXT idx_name (text_col) | 添加全文索引 | 仅MyISAM和InnoDB支持 | |
修改字符集 | ALTER TABLE table CONVERT TO CHARACTER SET charset COLLATE collation | 修改表字符集 | 将转换现有数据 |
-- 添加新列(指定位置)
ALTER TABLE employees ADD COLUMN phone VARCHAR(20) NOT NULL AFTER email;
-- 修改列数据类型和约束
ALTER TABLE employees MODIFY COLUMN salary DECIMAL(12,2) CHECK (salary >= 0);
-- 重命名列(必须指定数据类型)
ALTER TABLE employees CHANGE COLUMN phone mobile_phone VARCHAR(20);
-- 添加外键约束(命名约束)
ALTER TABLE employees ADD CONSTRAINT fk_department
FOREIGN KEY (dept_id) REFERENCES departments(id)
ON DELETE SET NULL ON UPDATE CASCADE;
-- 添加组合索引
ALTER TABLE employees ADD INDEX idx_name_department (last_name, dept_id);
-- 修改表注释
ALTER TABLE employees COMMENT='公司员工基本信息表';
-- 重命名表(两种方式)
ALTER TABLE employees RENAME TO staff;
-- 或
RENAME TABLE employees TO staff;
-- 修改存储引擎
ALTER TABLE employees ENGINE=InnoDB;
-- 修改字符集(转换现有数据)
ALTER TABLE employees CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;删除表是不可逆操作,需谨慎执行。
DROP [TEMPORARY] TABLE [IF EXISTS] table_name [, table_name2...]
[RESTRICT | CASCADE];语法各部分详细说明:
-- 安全删除单个表
DROP TABLE IF EXISTS temp_users;
-- 删除多个表
DROP TABLE temp_table1, temp_table2;
-- 仅删除临时表
DROP TEMPORARY TABLE temp_session_data;
-- 使用CASCADE强制删除(慎用)
DROP TABLE departments CASCADE;
操作 | 语法 | 描述 | 是否可恢复 |
|---|---|---|---|
DROP TABLE | DROP TABLE table_name | 删除整个表结构和数据 | 不可恢复 |
TRUNCATE TABLE | TRUNCATE TABLE table_name | 删除表中所有数据但保留结构 | 不可恢复 |
DELETE | DELETE FROM table_name [WHERE] | 删除部分或全部数据 | 可回滚 |
备份数据:
CREATE TABLE new_table SELECT * FROM old_table快速备份
依赖关系检查:
检查是否有视图、存储过程、触发器依赖该表
检查外键约束
SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME,
REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME = '要删除的表名';权限控制:
替代方案:
事务考虑:
