数据库中容易混淆的关键字alter/update...

目录

[1. alter与update区别](#1. alter与update区别)

[1.1 基本概念](#1.1 基本概念)

[1.2 常见操作](#1.2 常见操作)

[1.3 核心区别比对](#1.3 核心区别比对)

[2. change与modify区别](#2. change与modify区别)

[2.1 常见操作](#2.1 常见操作)

[2.2 功能比对](#2.2 功能比对)

[3. drop、truncate与delete区别](#3. drop、truncate与delete区别)

[3.1 基本概念](#3.1 基本概念)

[3.2 常见操作](#3.2 常见操作)

[3.3 功能比对](#3.3 功能比对)


1. alter与update区别

1.1 基本概念

ALTER 是 DDL(Data Definition Language,数据定义语言)命令,用于修改数据库对象的结构

UPDATE 是 DML(Data Manipulation Language,数据操作语言)命令,用于修改表中已存在的数据

1.2 常见操作

ALTER(修改表结构)常见操作

sql 复制代码
-- 添加新字段
ALTER TABLE users 
ADD COLUMN email VARCHAR(100) COMMENT '邮箱';

-- 修改字段类型
ALTER TABLE users 
MODIFY COLUMN age SMALLINT;

-- 修改字段名和类型
ALTER TABLE users 
CHANGE COLUMN old_name new_name VARCHAR(100);

-- 删除字段
ALTER TABLE users 
DROP COLUMN phone;

-- 添加唯一索引
ALTER TABLE users 
ADD UNIQUE INDEX uk_phone (phone);

UPDATE(修改表数据)常见操作

sql 复制代码
--修改字段值
UPDATE users 
SET 
    email = 'newemail@example.com',
    phone = '13800138000',
    updated_at = NOW()
WHERE id = 1;

-- 使用子查询更新
UPDATE orders o
SET o.total_amount = (
    SELECT SUM(quantity * price) 
    FROM order_items 
    WHERE order_id = o.id
)
WHERE o.id = 1001;

-- 使用JOIN更新
UPDATE users u
INNER JOIN user_profiles p ON u.id = p.user_id
SET u.nickname = p.display_name
WHERE p.is_verified = 1;

1.3 核心区别比对

对比维度 ALTER UPDATE
作用对象 表结构(DDL) 表数据(DML)
操作类型 数据定义语言 数据操作语言
主要用途 修改表结构(字段、索引等) 修改表中的数据
是否锁表 是(会锁表) 行级锁(InnoDB)
是否可回滚 不可回滚 可回滚(事务中)
影响范围 整个表结构 指定的行和列
执行速度 影响整个表结构,较慢 只影响指定行,较快
权限要求 ALTER权限 UPDATE权限

总结:

命令 记忆要点
ALTER 表结构(字段、索引、表名等)
UPDATE 表数据(字段值)

2. change与modify区别

2.1 常见操作

sql 复制代码
-- 修改字段名
--✅ 必须使用CHANGE
ALTER TABLE users 
CHANGE COLUMN email user_email VARCHAR(100);

--修改字段类型
- 方法1:使用MODIFY(推荐,更简洁)
ALTER TABLE users 
MODIFY COLUMN age SMALLINT;

-- 方法2:使用CHANGE(也可以,但繁琐)
ALTER TABLE users 
CHANGE COLUMN age age SMALLINT;
-- 注意:需要写两次 age,繁琐

2.2 功能比对

操作 CHANGE MODIFY RENAME COLUMN (8.0+)
修改字段名 ✅ 支持 ❌ 不支持 ✅ 支持(最佳)
修改字段类型 ✅ 支持 ✅ 支持 ❌ 不支持
修改默认值 ✅ 支持 ✅ 支持 ❌ 不支持
修改注释 ✅ 支持 ✅ 支持 ❌ 不支持
修改NULL约束 ✅ 支持 ✅ 支持 ❌ 不支持
修改字段位置 ✅ 支持 ✅ 支持 ❌ 不支持
同时改名改类型 ✅ 支持 ❌ 不支持 ❌ 不支持

核心区别比对:

对比维度 CHANGE MODIFY
主要用途 修改字段名 + 类型 只修改字段类型/属性
是否可改名 ✅ 可以 ❌ 不可以
语法复杂度 较复杂(需写两次字段名) 较简单(只写一次)
使用频率 需要改名时 只改类型时
易错程度 容易写错字段名 不易出错

总结:MODIFY改类型,CHANGE改名字,选最简单的用!

3. drop、truncate与delete区别

3.1 基本概念

DROP 用于完全删除数据库对象(表、数据库、视图、索引等),包括结构和数据。

TRUNCATE 用于快速删除表中所有数据,保留表结构,重置自增ID。

DELETE 用于删除表中的数据行,但保留表结构。

3.2 常见操作

drop常见操作

sql 复制代码
-- 删除数据库
DROP DATABASE database_name;

-- 删除表
DROP TABLE table_name;

-- 删除索引
DROP INDEX index_name ON table_name;

truncate常见操作

sql 复制代码
-- 示例1:清空表
TRUNCATE TABLE logs;

delete常见操作

sql 复制代码
-- 删除指定行
DELETE FROM table_name WHERE condition;

-- 删除所有行(保留表结构)
DELETE FROM table_name;

-- 基于子查询删除
DELETE FROM orders 
WHERE user_id IN (
    SELECT id FROM users WHERE status = 0
);

-- 使用JOIN删除
DELETE o FROM orders o
INNER JOIN users u ON o.user_id = u.id
WHERE u.status = 0;

3.3 功能比对

核心功能比对:

对比维度 DROP DELETE TRUNCATE
命令类型 DDL(数据定义语言) DML(数据操作语言) DDL(数据定义语言)
作用对象 删除整个表结构+数据 删除表中的数据(行) 删除表中所有数据
是否保留表结构 ❌ 不保留 ✅ 保留 ✅ 保留
是否可回滚 ❌ 不可回滚 ✅ 可回滚(事务中) ❌ 不可回滚
删除速度 慢(逐行删除) 很快
自增ID 删除 不重置 重置为初始值
触发器 不触发 触发DELETE触发器 不触发
WHERE条件 ❌ 不支持 ✅ 支持 ❌ 不支持
释放空间 立即释放 不立即释放 立即释放
日志记录 少量日志 记录每行删除 少量日志

如何选择?

sql 复制代码
需要删除什么?
│
├─ 删除整个表(结构+数据)
│  └─ 使用 DROP TABLE
│
├─ 清空表中所有数据(保留结构)
│  ├─ 需要重置自增ID?
│  │  ├─ 是 → 使用 TRUNCATE TABLE
│  │  └─ 否 → 使用 DELETE FROM(如需回滚)
│  │
│  └─ 表有外键约束?
│     ├─ 是 → 使用 DELETE FROM
│     └─ 否 → 使用 TRUNCATE TABLE(更快)
│
└─ 删除部分数据(指定条件)
   └─ 使用 DELETE FROM ... WHERE

总结:DROP = 删除表(结构+数据) DELETE = 删除数据(保留结构,支持条件) TRUNCATE = 清空数据(保留结构,重置ID)

相关推荐
cqsztech1 小时前
如何在Oracle linux9.6 安装docker软件
数据库·docker·oracle
JIngJaneIL1 小时前
基于Java民宿管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot
档案宝档案管理1 小时前
档案管理效率低?档案管理系统如何实现从“人工管档”到“智能管档”?
大数据·数据库·人工智能·档案·档案管理
van久1 小时前
.Net Core 学习:Razor Pages -- EF Core工作原理
数据库·学习·.netcore
北岛寒沫2 小时前
北京大学国家发展研究院 经济学辅修 经济学原理课程笔记(第三课 需求与供应弹性)
数据库·人工智能·笔记
不想画图2 小时前
数据库基础操作和权限管理
数据库·mysql
如果未来,2 小时前
Oracle数据库的存储结构以及表空间的概念
数据库·oracle
b***46242 小时前
Redis开启远程访问
数据库·redis·缓存
KaiwuDB2 小时前
KaiwuDB X 向明智控:基于 KaiwuDB 的煤矿综采数据分析系统
数据库