MySQL表操作 #
一、表概述 #
1.1 什么是表 #
表(Table)是数据库中存储数据的基本单位,由行(记录)和列(字段)组成。
text
┌─────────────────────────────────────────────┐
│ users 表 │
├─────────┬──────────┬─────────┬─────────────┤
│ id │ name │ age │ email │ ← 列(字段)
├─────────┼──────────┼─────────┼─────────────┤
│ 1 │ John │ 25 │ john@ex.com │ ← 行(记录)
│ 2 │ Jane │ 30 │ jane@ex.com │
│ 3 │ Bob │ 28 │ bob@ex.com │
└─────────┴──────────┴─────────┴─────────────┘
1.2 表的组成 #
| 组成部分 | 说明 |
|---|---|
| 表名 | 标识表的名称 |
| 列名 | 标识字段的名称 |
| 数据类型 | 字段存储的数据类型 |
| 约束 | 字段的限制条件 |
二、创建表 #
2.1 基本语法 #
sql
CREATE TABLE table_name (
column1 datatype constraints,
column2 datatype constraints,
...
);
2.2 创建简单表 #
sql
-- 创建用户表
CREATE TABLE users (
id INT,
name VARCHAR(50),
age INT,
email VARCHAR(100)
);
2.3 创建带约束的表 #
sql
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT DEFAULT 0,
email VARCHAR(100) UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
2.4 完整示例 #
sql
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
username VARCHAR(50) NOT NULL COMMENT '用户名',
password VARCHAR(100) NOT NULL COMMENT '密码',
email VARCHAR(100) UNIQUE COMMENT '邮箱',
phone CHAR(11) COMMENT '手机号',
age TINYINT UNSIGNED DEFAULT 0 COMMENT '年龄',
gender ENUM('male', 'female', 'other') DEFAULT 'male' COMMENT '性别',
status TINYINT DEFAULT 1 COMMENT '状态:1启用 0禁用',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
三、约束 #
3.1 约束类型 #
| 约束 | 说明 | 关键字 |
|---|---|---|
| 主键约束 | 唯一标识每行记录 | PRIMARY KEY |
| 外键约束 | 建立表之间的关联 | FOREIGN KEY |
| 唯一约束 | 字段值唯一 | UNIQUE |
| 非空约束 | 字段值不能为空 | NOT NULL |
| 默认约束 | 设置默认值 | DEFAULT |
| 自增约束 | 自动递增 | AUTO_INCREMENT |
| 检查约束 | 自定义条件 | CHECK |
3.2 主键约束 #
sql
-- 单列主键
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
);
-- 自增主键
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
);
-- 复合主键
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id)
);
-- 添加主键约束名
CREATE TABLE users (
id INT,
name VARCHAR(50),
CONSTRAINT pk_users PRIMARY KEY (id)
);
3.3 外键约束 #
sql
-- 创建主表
CREATE TABLE departments (
id INT PRIMARY KEY,
name VARCHAR(50)
);
-- 创建从表,添加外键
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
department_id INT,
CONSTRAINT fk_emp_dept
FOREIGN KEY (department_id)
REFERENCES departments(id)
);
-- 外键级联操作
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
department_id INT,
FOREIGN KEY (department_id)
REFERENCES departments(id)
ON DELETE CASCADE -- 删除主表记录时删除从表记录
ON UPDATE CASCADE -- 更新主表记录时更新从表记录
);
3.4 唯一约束 #
sql
-- 列级约束
CREATE TABLE users (
id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE
);
-- 表级约束
CREATE TABLE users (
id INT PRIMARY KEY,
email VARCHAR(100),
CONSTRAINT uk_users_email UNIQUE (email)
);
-- 组合唯一
CREATE TABLE user_roles (
user_id INT,
role_id INT,
UNIQUE (user_id, role_id)
);
3.5 非空约束 #
sql
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL
);
-- 插入时必须提供非空字段的值
INSERT INTO users (id, name, email) VALUES (1, 'John', 'john@example.com');
3.6 默认约束 #
sql
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
status INT DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 插入时可以省略有默认值的字段
INSERT INTO users (id, name) VALUES (1, 'John');
-- status 自动设为 1,created_at 自动设为当前时间
3.7 自增约束 #
sql
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
);
-- 自增从1开始
INSERT INTO users (name) VALUES ('John'); -- id = 1
INSERT INTO users (name) VALUES ('Jane'); -- id = 2
-- 指定起始值
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50)
) AUTO_INCREMENT = 1000;
-- 设置自增值
ALTER TABLE users AUTO_INCREMENT = 100;
3.8 检查约束 #
sql
-- MySQL 8.0+ 支持
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(50),
price DECIMAL(10,2),
CHECK (price > 0)
);
-- 命名检查约束
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
CONSTRAINT chk_users_age CHECK (age >= 0 AND age <= 150)
);
四、查看表 #
4.1 查看表列表 #
sql
-- 查看当前数据库的所有表
SHOW TABLES;
-- 查看指定数据库的表
SHOW TABLES FROM mydb;
-- 模糊查询
SHOW TABLES LIKE 'user%';
4.2 查看表结构 #
sql
-- 方式1:DESCRIBE(推荐)
DESC users;
DESCRIBE users;
+-------+--------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+-------------------+-----------------------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(50) | YES | | NULL | |
| age | int | YES | | NULL | |
+-------+--------------+------+-----+-------------------+-----------------------------+
-- 方式2:SHOW COLUMNS
SHOW COLUMNS FROM users;
-- 方式3:SHOW CREATE TABLE
SHOW CREATE TABLE users;
4.3 查看表详细信息 #
sql
-- 查看表状态
SHOW TABLE STATUS LIKE 'users';
-- 查看表索引
SHOW INDEX FROM users;
-- 从information_schema查询
SELECT
column_name,
data_type,
is_nullable,
column_default,
column_comment
FROM information_schema.columns
WHERE table_name = 'users' AND table_schema = 'mydb';
五、修改表 #
5.1 修改表名 #
sql
-- 方式1
RENAME TABLE users TO user_info;
-- 方式2
ALTER TABLE users RENAME TO user_info;
5.2 添加列 #
sql
-- 添加单列
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
-- 添加多列
ALTER TABLE users
ADD COLUMN phone VARCHAR(20),
ADD COLUMN address VARCHAR(200);
-- 指定位置
ALTER TABLE users ADD COLUMN age INT AFTER name; -- 在name之后
ALTER TABLE users ADD COLUMN id INT FIRST; -- 在第一列
5.3 修改列 #
sql
-- 修改列数据类型
ALTER TABLE users MODIFY COLUMN name VARCHAR(100);
-- 修改列名和类型
ALTER TABLE users CHANGE COLUMN name username VARCHAR(50);
-- 修改列默认值
ALTER TABLE users ALTER COLUMN status SET DEFAULT 1;
-- 删除默认值
ALTER TABLE users ALTER COLUMN status DROP DEFAULT;
5.4 删除列 #
sql
-- 删除单列
ALTER TABLE users DROP COLUMN phone;
-- 删除多列
ALTER TABLE users
DROP COLUMN phone,
DROP COLUMN address;
5.5 添加约束 #
sql
-- 添加主键
ALTER TABLE users ADD PRIMARY KEY (id);
-- 添加唯一约束
ALTER TABLE users ADD UNIQUE (email);
-- 添加外键
ALTER TABLE orders
ADD CONSTRAINT fk_orders_users
FOREIGN KEY (user_id) REFERENCES users(id);
-- 添加检查约束
ALTER TABLE users ADD CHECK (age >= 0);
5.6 删除约束 #
sql
-- 删除主键
ALTER TABLE users DROP PRIMARY KEY;
-- 删除唯一约束
ALTER TABLE users DROP INDEX uk_users_email;
-- 删除外键
ALTER TABLE orders DROP FOREIGN KEY fk_orders_users;
-- 删除检查约束
ALTER TABLE users DROP CHECK chk_users_age;
5.7 修改存储引擎 #
sql
ALTER TABLE users ENGINE = InnoDB;
5.8 修改字符集 #
sql
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
六、删除表 #
6.1 删除表 #
sql
-- 删除表
DROP TABLE users;
-- 如果存在则删除
DROP TABLE IF EXISTS users;
-- 删除多个表
DROP TABLE users, orders, products;
6.2 清空表 #
sql
-- 方式1:TRUNCATE(推荐,更快)
TRUNCATE TABLE users;
-- 方式2:DELETE
DELETE FROM users;
-- 区别:
-- TRUNCATE:重置自增值,不记录日志,更快
-- DELETE:保留自增值,记录日志,可以带条件
6.3 删除注意事项 #
sql
-- 删除前检查
-- 1. 确认表名
SHOW TABLES LIKE 'users';
-- 2. 查看表内容
SELECT COUNT(*) FROM users;
-- 3. 备份(如果需要)
-- mysqldump -u root -p mydb users > users_backup.sql
-- 4. 执行删除
DROP TABLE IF EXISTS users;
七、临时表 #
7.1 创建临时表 #
sql
-- 创建临时表
CREATE TEMPORARY TABLE temp_users (
id INT,
name VARCHAR(50)
);
-- 从查询结果创建临时表
CREATE TEMPORARY TABLE temp_orders AS
SELECT * FROM orders WHERE created_at > '2024-01-01';
7.2 临时表特点 #
sql
-- 临时表特点:
-- 1. 只在当前会话可见
-- 2. 会话结束自动删除
-- 3. 可以与普通表同名(临时表优先)
-- 查看临时表
SHOW TABLES; -- 不显示临时表
-- 删除临时表
DROP TEMPORARY TABLE temp_users;
八、表复制 #
8.1 复制表结构 #
sql
-- 只复制结构
CREATE TABLE users_copy LIKE users;
-- 查看结构
DESC users_copy;
8.2 复制结构和数据 #
sql
-- 复制结构和数据
CREATE TABLE users_backup AS SELECT * FROM users;
-- 注意:这种方式不会复制约束和索引
8.3 复制部分数据 #
sql
-- 复制部分数据
CREATE TABLE users_2024 AS
SELECT * FROM users WHERE YEAR(created_at) = 2024;
九、表设计最佳实践 #
9.1 命名规范 #
sql
-- 表名:小写,下划线分隔,使用复数
users
order_items
product_categories
-- 字段名:小写,下划线分隔
user_name
created_at
is_active
-- 主键:id 或 表名_id
id
user_id
-- 外键:关联表名_id
department_id
order_id
9.2 字段设计 #
sql
CREATE TABLE users (
-- 主键
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-- 字符串字段
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
-- 状态字段
status TINYINT UNSIGNED DEFAULT 1,
-- 布尔字段
is_active BOOLEAN DEFAULT TRUE,
-- 时间字段
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-- 索引
INDEX idx_username (username),
UNIQUE INDEX uk_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
9.3 表设计原则 #
| 原则 | 说明 |
|---|---|
| 范式设计 | 避免数据冗余 |
| 适当反范式 | 提高查询性能 |
| 选择合适类型 | 节省存储空间 |
| 添加必要索引 | 提高查询速度 |
| 添加注释 | 提高可维护性 |
十、总结 #
表操作要点:
| 操作 | 语法 |
|---|---|
| 创建 | CREATE TABLE table_name (…) |
| 查看 | DESC table_name |
| 修改 | ALTER TABLE table_name … |
| 删除 | DROP TABLE table_name |
| 清空 | TRUNCATE TABLE table_name |
约束要点:
| 约束 | 说明 |
|---|---|
| PRIMARY KEY | 主键,唯一标识 |
| FOREIGN KEY | 外键,关联表 |
| UNIQUE | 唯一约束 |
| NOT NULL | 非空约束 |
| DEFAULT | 默认值 |
| AUTO_INCREMENT | 自增 |
下一步,让我们学习数据操作!
最后更新:2026-03-26