MySQL修改数据表(ALTER TABLE语句)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL修改数据表(ALTER TABLE语句)

在MySQL中可以使用ALTER TABLE语句来改变原有表的结构,例如增加或删除减列、创建或取消索引、更改原有列类型、重新命名列或表等。

基本语法

修改表指的是修改数据库中已经存在的数据表的结构。MySQL 使用 ALTER TABLE语句修改表。常用的修改表的操作有修改表名、修改字段数据类型或字段名、增加和删除字段、修改字段的排列位置、更改表的存储引擎、删除表的外键约束等。

常用的语法格式如下:

ALTER TABLE <表名> [修改选项]

修改选项的语法格式如下:

{ADD COLUMN <列名> <类型>
| CHANGE COLUMN <旧列名> <新列名> <新列类型>
| ALTER COLUMN  <列名>  { SET DEFAULT <默认值> | DROP DEFAULT }
| MODIFY COLUMN <列名> <类型>
| DROP COLUMN <列名>
| RENAME TO <新表名>
}

添加字段

随着业务的变化,可能需要在已经存在的表中添加新的字段,一个完整的字段包括字段名、数据类型、完整性约束。添加字段的语法格式如下:

ALTER TABLE <表名> ADD COLUMN <新字段名> <数据类型> [约束条件] [FIRST|AFTER 已存在的字段名];
新字段名为需要添加的字段的名称; FIRST 为可选参数,其作用是将新添加的字段设置为表的第一个字段; AFTER 为可选参数,其作用是将新添加的字段添加到指定的 已存在的字段名的后面。

【实例1】使用ALTER TABLE修改表Student的结构,在表的第一列添加一个int类型的字段age,输入的SQL语句和运行结果如下:

mysql> alter table Student 
    -> add column s_age varchar(10) after s_name;
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc Student;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| s_id    | int(11)     | YES  |     | NULL    |       |
| s_name  | varchar(50) | YES  |     | NULL    |       |
| s_age   | varchar(10) | YES  |     | NULL    |       |
| s_birth | varchar(30) | YES  |     | NULL    |       |
| s_sex   | varchar(10) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
5 rows in set

mysql> 

添加主键

为保证数据的完整性,每个数据表都不会存在重复的数据,所以需要对表添加一些约束条件,例如,主键约束,唯一约束等等。

【实例2】使用ALTER TABLE修改表Student的结构,为表添加主键约束,并且设置属性s_id自动增长,输入的SQL语句和运行结果如下:

mysql> alter table Student
    -> modify column s_id int(11) primary key auto_increment;
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc Student;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| s_id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| s_name  | varchar(50) | YES  |     | NULL    |                |
| s_age   | varchar(10) | YES  |     | NULL    |                |
| s_birth | varchar(30) | YES  |     | NULL    |                |
| s_sex   | varchar(10) | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
5 rows in set

修改字段类型

有时候根据业务的需求,会对数据库的某个字段进行修改,例如Student中的S_sex字段存储是学生的性别,这种情况,只有两种要么是要么是。像这种情况,可以使用枚举类型存储。

【实例3】把Student表中的s_sex属性类型修改成枚举,输入的SQL语句和运行结果如下:

mysql> alter table Student
    -> modify column s_sex enum('男','女');
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc Student;
+---------+-----------------+------+-----+---------+----------------+
| Field   | Type            | Null | Key | Default | Extra          |
+---------+-----------------+------+-----+---------+----------------+
| s_id    | int(11)         | NO   | PRI | NULL    | auto_increment |
| s_name  | varchar(50)     | YES  |     | NULL    |                |
| s_age   | varchar(10)     | YES  |     | NULL    |                |
| s_birth | varchar(30)     | YES  |     | NULL    |                |
| s_sex   | enum('男','女') | YES  |     | NULL    |                |
+---------+-----------------+------+-----+---------+----------------+
5 rows in set

删除字段

表中的某个字段已经不需要了,要进行删除操作,可以使用如下命令:

ALTER TABLE <表名> DROP COLUMN <列名>

【实例4】把Student表中的s_birth字段删除,输入的SQL语句和运行结果如下:

mysql> alter table Student
    -> drop column s_birth;
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc Student;
+--------+-----------------+------+-----+---------+----------------+
| Field  | Type            | Null | Key | Default | Extra          |
+--------+-----------------+------+-----+---------+----------------+
| s_id   | int(11)         | NO   | PRI | NULL    | auto_increment |
| s_name | varchar(50)     | YES  |     | NULL    |                |
| s_age  | varchar(10)     | YES  |     | NULL    |                |
| s_sex  | enum('男','女') | YES  |     | NULL    |                |
+--------+-----------------+------+-----+---------+----------------+
4 rows in set

修改表名

MySQL 通过 ALTER TABLE 语句来实现表名的修改,语法规则如下:

ALTER TABLE <旧表名> RENAME [TO] <新表名>;

其中,TO 为可选参数,使用与否均不影响结果。

【实例5】使用 ALTER TABLE 将数据表 Student改名为 Student2,输入的 SQL 语句和运行结果如下所示

mysql> alter table Student rename to Student2;
Query OK, 0 rows affected

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| student2       |
+----------------+
1 row in set

mysql> 
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
5月前
|
关系型数据库 MySQL 索引
MySQL数据表添加字段的三种方式
MySQL数据表添加字段的三种方式
4584 0
|
3月前
|
存储 SQL 关系型数据库
MySQL 给数据表增加一列,一定会锁表吗?
【8月更文挑战第8天】在数据库管理和开发中,给数据表增加一列是一个常见的操作。然而,当面试官提出“MySQL 给数据表增加一列,一定会锁表吗?”这一问题时,答案并非绝对。这主要取决于MySQL的版本、存储引擎以及具体的操作方式。
341 0
|
2月前
|
SQL 关系型数据库 MySQL
MySQL 8.0报错--1118-Row size too large. The maximum row size for the used table type, not counting BLOBs,is 8126,
MySQL 8.0报错--1118-Row size too large. The maximum row size for the used table type, not counting BLOBs,is 8126,
MySQL 8.0报错--1118-Row size too large. The maximum row size for the used table type, not counting BLOBs,is 8126,
|
1月前
|
监控 关系型数据库 MySQL
MySQL数据表索引命名规范
MySQL数据表索引命名规范
56 1
|
1月前
|
SQL 关系型数据库 MySQL
MySQL异常一之: You can‘t specify target table for update in FROM clause解决办法
这篇文章介绍了如何解决MySQL中“不能在FROM子句中指定更新的目标表”(You can't specify target table for update in FROM clause)的错误,提供了错误描述、需求说明、错误做法和正确的SQL写法。
356 0
|
1月前
|
存储 监控 关系型数据库
MySQL造数据占用临时表空间
MySQL造数据占用临时表空间
38 0
|
2月前
|
存储 SQL 关系型数据库
MySQL 数据表操作
MySQL 数据表操作
39 1
|
3月前
|
关系型数据库 MySQL 数据库
在 MySQL 中使用 Alter Table
【8月更文挑战第11天】
157 0
在 MySQL 中使用 Alter Table
|
5月前
|
关系型数据库 MySQL 数据库
【MySQL】MySQL数据库的delete from table和truncate table之间的区别
【MySQL】MySQL数据库的delete from table和truncate table之间的区别
605 1
|
5月前
|
关系型数据库 数据管理 数据库
数据管理DMS产品使用合集之如何极速恢复RDS(关系型数据库服务)中的数据表
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
114 3