MySQL alter命令修改表详解

本文讲解了如何在MySQL中使用ALTERTABLE进行表结构的增删改查,包括添加列、重命名、修改定义、设置主键、删除字段等操作,配合实例帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

ALTER TABLE 语法

ALTER TABLE 实例

添加一列

添加多列

重命名列

修改列定义

修改列名和定义

添加主键

删除列

重命名表

修改表的存储引擎

结论


在使用表的过程中,如果您需要对表进行修改,您可以使用 ALTER TABLE 语句。通过 ALTER TABLE 语句,您可以重命名表、重命名列、添加列、删除列、修改列的属性等。

ALTER TABLE 语法

ALTER TABLE table_name
  [alter_action options], ...

其中 alter_action 是一个修改动作,包括

ADD 关键字可用来添加列、索引、约束等,包括:

  • ADD [COLUMN]: 添加列
  • ADD INDEX: 添加索引
  • ADD PRIMARY KEY: 添加主键
  • ADD FOREIGN KEY: 添加外键
  • ADD UNIQUE INDEX: 添加唯一索引
  • ADD CHECK: 添加检查约束

DROP 关键字可用来删除列、索引、约束等,包括:

  • DROP [COLUMN] col_name: 删除列
  • ADD INDEX index_name: 删除索引
  • DROP PRIMARY KEY: 删除主键
  • DROP FOREIGN KEY fk_symbol: 删除外键
  • DROP CHECK symbol: 删除检查约束

MODIFY 关键字用来修改列的定义。与 CHANGE 关键字不同,它不能重命名列。例如: MODIFY [COLUMN] col_name column_definition

CHANGE 关键字用来修改列的定义。与 MODIFY 关键字不同,它可以重命名列。例如: CHANGE [COLUMN] old_col_name new_col_name column_definition

RENAME 关键字可以重命名列、索引和表。包括:

  • RENAME COLUMN old_col_name TO new_col_name: 重命名列。
  • RENAME INDEX old_index_name TO new_index_name: 重命名索引。
  • RENAME new_tbl_name: 重命名表。

ALTER TABLE 实例

从 ALTER TABLE 语法看出, ALTER TABLE 用法很多。为了演示 ALTER TABLE 用法,我们在 testdb 数据库中创建一个表 user

请执行以下语句:

CREATE TABLE user (id INT);

通过以下语句查看 user 表的定义。

DESC user;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| id    | int  | YES  |     | NULL    |       |
+-------+------+------+-----+---------+-------+
1 row in set (0.00 sec)

下面让我们看一些实际的例子。

添加一列

以下语句使用 ADD 关键字在 user 表中添加了 name 列。

ALTER TABLE user
ADD name VARCHAR(20);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

注意,当向包含数据的表中添加列时,新添加的列不满足表的约束定义,则会返回错误。

添加多列

以下语句使用 ADD 关键字在 user 表中添加了 age 和 email 列。

ALTER TABLE user
ADD age INT,
ADD email VARCHAR(50);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

重命名列

以下语句使用 RENAME COLUMN 关键字,将 user 表的 name 列重命名为 username

ALTER TABLE user
RENAME COLUMN name TO username;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

以下是修改后的表定义:

+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int         | YES  |     | NULL    |       |
| username | varchar(20) | YES  |     | NULL    |       |
| age      | int         | YES  |     | NULL    |       |
| email    | varchar(50) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

修改列定义

以下语句使用 MODIFY 关键字,将 user 表的 username 列由 varchar(20) 修改为 VARCHAR(45)

ALTER TABLE user
MODIFY username VARCHAR(45);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

以下是修改后的表定义:

+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int         | YES  |     | NULL    |       |
| username | varchar(45) | YES  |     | NULL    |       |
| age      | int         | YES  |     | NULL    |       |
| email    | varchar(50) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

修改列名和定义

以下语句使用 CHANGE 关键字,将 user 表的 username 列修改为 name VARCHAR(30)

ALTER TABLE user
CHANGE username name VARCHAR(30);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

以下是修改后的表定义:

+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(30) | YES  |     | NULL    |       |
| age   | int         | YES  |     | NULL    |       |
| email | varchar(50) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

添加主键

以下语句使用 ADD 关键字,将 user 表的 id 列设置为主键。

ALTER TABLE user
ADD PRIMARY KEY(id);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

注意,由于主键要求列的值是唯一的并且不能为 NULL,如果该列中有重复的值或者 NULL 值,则会返回错误。同样,如果你添加唯一索引,也可能会出现相同的错误。

以下是修改后的表定义:

+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | NO   | PRI | NULL    |       |
| name  | varchar(30) | YES  |     | NULL    |       |
| age   | int         | YES  |     | NULL    |       |
| email | varchar(50) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

删除列

下面语句使用 DROP 关键字删除了 email 列。

ALTER TABLE user
DROP COLUMN email;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

注意:删除列是很危险的操作,因为它会永久删除列中的数据。这是不可撤销的操作,请谨慎。

以下是删除后的表定义:

+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | NO   | PRI | NULL    |       |
| name  | varchar(30) | YES  |     | NULL    |       |
| age   | int         | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

重命名表

下面语句使用 RENAME 关键字将 user 表重命名为 users

ALTER TABLE user
RENAME users;

我们还可以是用 RENAME TABLE 语句重命名表,它的用法如下:

RENAME TABLE table_name TO new_table_name;

下面的语句同样实现将 user 表重命名为 users

RENAME TABLE user TO users;

修改表的存储引擎

ALTER TABLE 命令也可以用于修改一张表的存储引擎。可以使用以下语法:

ALTER TABLE table_name ENGINE=engine_name;

其中,table_name是要修改的表的名称,engine_name是新的存储引擎。

示例:

-- 将customer表的存储引擎改为innodb
ALTER TABLE customer ENGINE=InnoDB; 

结论

在本文中,我们介绍了在 MySQL 服务器上如何使用 ALTER TABLE 语句修改表,包括:添加列、删除列、修改列、重命名列、重命名表和设置主键等。本文要点包括:

  • ALTER TABLE 关键字后面跟要修改的表名。
  • ADD 关键字可用来添加列、索引、约束等。
  • DROP 关键字可用来删除列、索引、约束等。
  • RENAME 关键字可以重命名列、索引和表。
  • MODIFY 关键字用来修改列的定义。
  • CHANGE 关键字用来修改列的定义和列名。
  • RENAME TABLE ... TO ... 用来重命名表。
-- alter table 修改表结构(表名,列名,列的数据类型,相关约束)
use d3;
show tables;
-- 查看表结构
desc tuser;
describe tuser;
show columns from tuser;
describe table tuser;
-- 修改表名
alter table tuser rename userinfo;
rename table userinfo to tuser;
-- 移动表表tt2从db2库移动当前数据库为tt3表
rename table db2.tt2 to tt3;
/*
RENAME TABLE
tbl_name TO new_tbl_name
[, tbl_name2 TO new_tbl_*/
drop table if exists
t,t1,t3,s,stu,user,tuser,tteacher,dept,employees,student;
create table t1(t int);
create table t2(t int);
create table t3(t int);
-- 修改多个表的名称
rename table
t1 to tt1,
t2 to tt2,
t3 to tt3;
-- 查看表结构
desc tt1;
-- 查看建立数据库的语句
show create database mysql;
-- 查看建立表的语句
show create table tt1;
rename table tt1 to student;
-- 增加字段类型
alter table student add column id int unsigned auto_increment primary key;
alter table student add sname varchar(15) not null;
alter table student add age tinyint unsigned default 18;
alter table student add gender enum('男','女') default '男' after sname;
alter table student add address varchar(255) first;
-- 修改列的类型 及 位置
alter table student modify address varchar(255) after age;
-- 修改列名
alter table student rename column address to saddr;
-- 修改列名 类型 及 位置
alter table student change saddr address varchar(100) after age;
-- 复制表结构或建立一个空表
create table stu like student;
-- 根据查询的内容建立一个表,此表没有相关的约束,不推荐使用
create table t1 as select 20,'jack';
-- 删除字段
alter table student drop column t;
-- 修改表名 student cf_student cf_user cf_admin cf_car
rename table w_student to cf_student;
alter table cf_student rename st;
-- 查看表结构
describe st;
desc st;
-- 查看建立表语句
show create table st;
CREATE TABLE `st` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(30) NOT NULL,
`gender` enum('男','女') DEFAULT NULL,
`course` set('计算机英语','高数','离散数学','线性代数') DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb3
-- 增加一列(字段)
-- 删除一列(字段)
-- 修改列名
-- 修改列的数据类型 int bigint varchar int varchar(30) varchar(5)
select * from st;
-- 增加一列
alter table st add address varchar(255) not null default '郑州市';
alter table st add age tinyint unsigned not null default 18 first;
alter table st add age tinyint unsigned default 0 after name;
-- 删除一列
alter table st drop address;
alter table st drop column age;
-- 修改列名 name StudentName sname
alter table st rename column name to sname;
alter table st change sname name varchar(30) first;
alter table st change name name varchar(30) after id;
-- 修改列的数据类型及精度
alter table st modify name varchar(100) after address;
alter table st modify name varchar(50) after id;
-- 复制表的结构
-- create table t6(t int);
create table st2 like st;
show create table st2;
select * from st2;
-- 插入数据
insert into st2 select * from st;
show tables;
-- 根据查询的结构,建立一个没有相关约束的表,可以直接插入数据
create table st3 as select id,name from st;
create table st4 as select id,name,address from st where name like '李%';
select * from st3;
show create table st3;
drop table st3;
select * from st4;

<think>好的,用户现在想了解tcpdump命令的基本用法和参数含义,并且要求详细的解释和常用参数说明。之前用户已经询问过具体的指令解释,现在需要更全面的内容。首先,我需要回顾之前的回答,确保这次的信息不重复但更全面。 用户之前问过关于`tcpdump -i mgbe2_0 -w fd961628.pcap -s0`的具体参数,所以我需要扩展其他常用参数,比如过滤达式、限制抓包数量等。同时,用户提供的引用提到-s选项的重要性,特别是默认抓取长度可能不足,需要强调-s0的作用,并可能补充其他相关参数。 用户可能的需求是掌握tcpdump的基本操作,用于网络调试或安全分析。他们可能不太熟悉命令行工具,需要清晰的结构和示例。因此,我应该分步骤介绍,从基本命令格式到常用参数,再给出示例,最后常见问题。 需要注意引用中的信息,比如引用[1]提到-s参数的重要性,引用[2]给出了命令的选项列,可以结合这些内容来丰富参数说明。同时,确保回答符合之前设定的格式,使用中文,正确应用LaTeX格式,比如变量用$...$,独立公式用$$...$$,但在这里可能用不上数学公式,但需要检查是否有需要的地方。 另外,用户可能需要实际例子来理解参数如何组合使用,比如如何抓取特定端口、IP或协议的数据包。需要提供这些例子,并解释每个参数的作用。同时,常见问题部分需要解决用户可能遇到的权限问题、如何过滤流量、保存和读取文件等。 还要注意用户提到的“尽可能多的参考用户上一次的问题和你的回答”,所以需要回顾之前的回答,确保参数解释一致,但这次更全面。比如之前提到了-i、-w、-s,现在要补充其他参数如-c、-v、-n等。 最后,生成相关问题,帮助用户进一步学习,比如如何过滤特定协议、组合参数使用等。确保问题覆盖用户可能感兴趣的进阶主题。</think>### **`tcpdump` 命令详解与常用参数说明** `tcpdump` 是 Linux/Unix 系统下强大的网络抓包工具,用于捕获和分析网络流量。以下是其核心用法和参数解析: --- ### **1. 基础命令格式** ```bash tcpdump [选项] [过滤达式] ``` - **核心功能**:监听指定网络接口的流量,按条件过滤并输出或保存数据包。 --- ### **2. 常用参数详解** #### **(1) 接口与输出控制** | 参数 | 作用 | 示例 | |------------|----------------------------------------------------------------------|----------------------------------------------------------------------| | `-i <接口>` | 指定监听的网络接口(默认监听第一个非回环接口) | `tcpdump -i eth0` 监听 `eth0` 网卡[^1] | | `-w <文件>` | 将原始数据包保存到文件(`.pcap` 格式) | `tcpdump -w traffic.pcap` 保存到当前目录 | | `-r <文件>` | 读取已保存的抓包文件进行分析 | `tcpdump -r traffic.pcap` 解析文件内容 | | `-s <长度>` | 设置抓包长度(`-s0` 示抓取完整数据包,默认仅抓前 96 字节) | `tcpdump -s 1500` 抓取前 1500 字节(适用于分析 HTTP 负载)[^1] | #### **(2) 抓包控制** | 参数 | 作用 | 示例 | |------------|----------------------------------------------------------------------|----------------------------------------------------------------------| | `-c <数量>` | 捕获指定数量的包后自动停止 | `tcpdump -c 100` 抓取 100 个包后退出 | | `-G <秒>` | 按时间间隔分割保存文件 | `tcpdump -G 3600 -w %H_%M.pcap` 每小时生成一个文件[^2] | | `-Z <用户>` | 以指定用户权限运行(避免 root 权限风险) | `sudo tcpdump -Z nobody` 以 `nobody` 用户身份运行 | #### **(3) 输出格式控制** | 参数 | 作用 | 示例 | |------------|----------------------------------------------------------------------|----------------------------------------------------------------------| | `-n` | 禁用域名解析(直接显示 IP 地址) | `tcpdump -n` 输出中显示 `192.168.1.1` 而非 `host.example.com` | | `-v/-vv/-vvv` | 增加输出详细级别(`-vvv` 显示最详细信息) | `tcpdump -vv` 显示 TTL、校验和等字段 | | `-q` | 简化输出(仅显示协议和端口) | `tcpdump -q` 输出类似 `IP 192.168.1.1.22 > 10.0.0.2.443: tcp 0` | | `-e` | 显示数据链路层信息(如 MAC 地址) | `tcpdump -e` 输出包含 `00:1a:4b:xx:xx:xx > 00:1c:b3:xx:xx:xx` | #### **(4) 过滤达式** 过滤达式用于筛选特定流量,支持协议、IP、端口、逻辑运算符等组合: - **协议过滤**:`tcp`, `udp`, `icmp`, `arp` ```bash tcpdump 'tcp' # 仅抓 TCP 流量 tcpdump 'icmp' # 仅抓 ICMP 包(如 ping 请求) ``` - **IP/端口过滤**:`host`, `port`, `src`, `dst` ```bash tcpdump 'host 192.168.1.1' # 抓取与 192.168.1.1 相关的流量 tcpdump 'src 10.0.0.5 and port 80' # 抓取源 IP 为 10.0.0.5 的 HTTP 流量[^2] ``` - **逻辑运算符**:`and`, `or`, `not` ```bash tcpdump 'port 443 or port 80' # 抓取 HTTPS 或 HTTP 流量 tcpdump 'tcp and not src 192.168.1.1' # 抓取 TCP 流量且排除源 IP 192.168.1.1 ``` --- ### **3. 典型使用场景与示例** #### **(1) 基础抓包** ```bash # 抓取 eth0 接口的所有流量,显示 IP 和端口(禁用域名解析) tcpdump -i eth0 -n # 抓取完整数据包并保存到文件(用于 Wireshark 分析) tcpdump -i any -s0 -w full_traffic.pcap ``` #### **(2) 协议与端口过滤** ```bash # 抓取 DNS 请求(UDP 端口 53) tcpdump -i eth0 'udp port 53' # 抓取 SSH 登录流量(TCP 端口 22) tcpdump -n 'tcp port 22 and (tcp-syn|tcp-ack)!=0' ``` #### **(3) 高级过滤** ```bash # 抓取 HTTP GET 请求(包含 "GET" 字符串的 TCP 包) tcpdump -s0 -A 'tcp port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420' # 抓取源 IP 为 192.168.1.100 的 ICMP 包 tcpdump 'icmp and src 192.168.1.100' ``` --- ### **4. 常见问题解答** 1. **抓包文件如何分析?** - 使用 `-r` 参数读取:`tcpdump -r traffic.pcap` - 或用 Wireshark 图形化工具打开。 2. **权限不足如何解决?** - 普通用户需 `sudo` 提权: ```bash sudo tcpdump -i eth0 ``` 3. **如何避免抓包文件过大?** - 使用 `-c` 限制包数量:`tcpdump -c 1000 -w traffic.pcap` - 或用 `-G` 分割文件:`tcpdump -G 600 -w %H_%M.pcap`(每 10 分钟保存一次)[^2]。 4. **过滤达式语法错误?** - 复杂达式需用引号包裹:`tcpdump 'tcp and (port 80 or port 443)'` --- ### **5. 进阶技巧** - **捕获特定包内容**: ```bash tcpdump -X -s0 'port 80' # 以十六进制和 ASCII 格式显示负载 ``` - **排除特定流量**: ```bash tcpdump 'not arp' # 忽略 ARP 广播包 ``` - **统计流量特征**: ```bash tcpdump -qtnvi eth0 # 显示简化的流量统计信息 ``` --- ### **相关问题** 1. **如何抓取指定 IP 的 HTTP 请求负载内容?** 2. **`tcpdump` 如何过滤 VLAN 标签流量?** 3. **如何实时显示抓包的 TCP 窗口大小?** 4. **`tcpdump` 与 `Wireshark` 结合使用的技巧有哪些?** --- **引用说明** [^1]: 默认抓包长度可能截断关键负载(如 HTTP 请求),需通过 `-s0` 捕获完整数据[^1]。 [^2]: 使用 `-G` 参数可按时间分割抓包文件,便于长期监控[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bridge Fish

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值