MySQL修改表结构(五)中

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

二. 维护表字段


维护字段的信息,主要就是 添加字段,修改字段的类型,顺序, 删除字段等。


新添加一个表 yjlCol, 对这个表进行相应的字段操作


create table yjlCol(
     id int(11),
    name varchar(20),
     sex varchar(10)
   );


20191118151646871.png


二.一 添加字段 用add


添加一个完整的字段, 包括 字段名,数据类型,完整性约束。 对于一个已经创建好的表 添加字段来说, 还需要指定一下所放置的顺序。


所用命令:


  alter table 表名 add 新字段名  数据类型  [约束条件]  [first|after 已经存在的字段名]


其中,顺序可以不指定。 如果不指定顺序的话,默认是 放置在最后一个。 约束条件,只能是列级别约束。


二.一.一 添加无约束的字段 description, 类型是 varchar(100)

  alter table yjlCol add description varchar(100);


20191118151730784.png


二.一.二 添加有约束字段 age, 类型是 int(11), 不为空。


  alter table yjlCol add age int(11) not null;


20191118151745364.png


二.一.三 添加一个新的字段 yId, 类型是 int(11), 是主键,放置在最开始的位置。


  alter table yjlCol add yId int(11) primary key auto_increment  first;


20191118151750148.png


二.一.四 添加一个新的字段 ysex, 类型是 varchar(10), 唯一约束, 放置在 sex 之后。


  alter table yjlCol add ysex varchar(10) unique after sex;


20191118151804486.png


二.一.五 添加字段时,关于主键问题:


1 . 现在表 yjlCol 已经有主键了, 那么再新添加一个主键呢? yyId 。 会报错的。


alter table yjlCol add yyId int(11) primary key first;


2019111815181268.png


2 . 将这个表 yjlCol 删除掉, 再重新创建 yjlCol, 仍然用最开始的那条语句, 只有id,name,sex 三个字段。


  drop table yjlCol; 


20191118151821995.png


删除之后,重新创建表。


create table yjlCol(
     id int(11),
    name varchar(20),
     sex varchar(10)
   );


20191118151646871 (1).png


3 . 添加一个字段 yId, 是not null, unique 约束,但不是主键, 放置在最开始的位置。 现在表 yjlCol 没有主键。


 alter table yjlCol add yId int(11) not null unique first;


20191118151832841.png


是创建成功的。


用 show create table yjlCol 展示信息:


20191118151917900.png


用 desc yjlCol 展示信息:


20191118151923740.png


发现,会将新添加的yId 当成主键。


这是因为 没有主键的原因。


4 . 新添加一个主键 yyId , primary Key int(11) 类型。


 alter table yjlCol add yyId int(11) primary key first;


20191118151927521.png


可以正常的添加。


这个时候,再 desc yjlCol 展示信息:


2019111815200064.png


这个时候, yId 的约束 就是 unique, 而不是主键了。


二.二 修改字段 modify(修改的意思)


修改的时候, 也是从 列名,数据类型,约束条件,顺序 方面进行相应的修改。 但修改时, 用的是 modify, 并且也不像 添加字段那样,可以用一个 命令进行处理。 不同的修改,有着不同的 命令语句。


将这个表 yjlCol 删除掉, 再重新创建 yjlCol, 仍然用最开始的那条语句, 只有id,name,sex 三个字段。


  drop table yjlCol; 


删除之后,重新创建表。


create table yjlCol(
     id int(11),
    name varchar(20),
     sex varchar(10)
   );


二.二.一 修改数据类型


只能修改已经存在的列名的数据类型, 包括长度的修改和数据类型的修改。


命令:


  alter table 表名 modify 已经存在的列名  新的数据类型


1 . 只改变长度,举例: 将sex 的varchar(10) 变成 varchar(5)


  alter table yjlCol modify sex varchar(5)


20191118152012539.png


2 . 改变类型。 举例: 将sex 的varchar(5) 变成 int(2).


性别以前存储的是 汉字, 男或者女。 现在存储数字, 1代表男,2代表女。


  alter table yjlCol modify sex int(2);


20191118152022918.png


3 . 修改一个不存在的列名 , 如age 的类型为 int(3). 发现是错误的


alter table yjlCol modify age int(3);


20191118152032464.png


4 . 修改时添加约束。 如 name 时 为不为空 约束。 这样添加约束是可以的。


alter table yjlCol modify name varchar(20) not null;


20191118152038988.png


二.二.二 修改字段名/修改列名 change


只可以修改列名。将一个列名,变成新的列名。


命令:


  alter table 表名  change 旧字段名  新字段名  新数据类型


注意, 新的数据类型 一定要存在,不能省略。


1 .演示: 将name 变成 yname, 数据类型还是以前的数据类型


alter table yjlCol change name newName varchar(20);


20191118152050734.png


2 . 演示: 将sex 变成 newSex, 数据类型由以前的 int(2) 变成 varchar(10)


alter table yjlCol change sex newSex varchar(10);


20191118152058257.png


3 当旧字段名与 新的字段名相同时, 表示只修改数据类型, 达到 二.二.一 部分的功能。


如 newSex 变成 newSex, 类型 变成 int(2)


  alter table yjlCol change newSex newSex int(2) ;


20191118152106362.png


二.二.三 修改字段的顺序 modify


改变一下, 表中各个列的顺序。


命令:


  alter table 表名  已经存在的字段  数据类型   first| after 已经存在的字段名


其中,注意到, 如果将后面的 顺序 first|after 已经存在的字段名 去除掉,就是 二.二.一 的部分内容。


1 . 将 newSex 放置在最前面 (没有修改数据类型)


  alter table yjlCol newSex int(2) first;


20191118152116121.png


2 . 将 newSex 重新放置到 newName 的后面 (没有修改数据类型)


  alter table yjlCol modify newSex int(2) after newName;


20191118152120904.png


3 . 将 newSex 放置到 最前面, 并且改变数据类型 为varchar(10)


  alter table yjlCol modify newSex varchar(10) first;


20191118152136755.png


二.三 删除字段 drop


命令:


  alter table 表名  drop 已经存在的列名


1 . 如 删除表 yjlCol 里面的 newSex 字段 (newSex 不是主键)


  alter table yjlCol drop newSex


20191118152147285.png


2 . 将 yjlCol 的id 变成主键,删除再删除 id, 验证一下主键的字段是否能够删除


alter table yjlCol modify id int(11) primary key auto_increment;
 alter table yjlCol drop id;


20191118152151693.png


注意,以上字段的 修改和删除部分,在表 yjlCol 里面是没有数据的。 如果有数据的话,修改 类型时, sex 原先是 varchar(10), 存放的是 ‘男’ 或者 ‘女’, 现在修改时突然变成了 int(2), 这个时候肯定是错误的, 是不让修改的。 删除主键时, 表里面的两条数据除了id 不一样外,全部都一样, 你删除了 id, 那么这两条记录就完全一致了,是不能删除这个字段的。 还有, 记录里面有 两条记录, name值相同, 你将name的约束改成 unique 唯一, 这样也是错误的。 故,老蝴蝶建议 一定要在设计之初就仔细分析,创建表, 不要在有了数据之后,再进行维护表的字段信息。 下面的约束条件,也是有这样的问题的。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
7月前
|
Oracle 关系型数据库 MySQL
MySQL复制表结构create table as与like的区别
MySQL复制表结构create table as与like的区别
|
8月前
|
存储 SQL 关系型数据库
表结构的操作【MySQL】
表结构的操作【MySQL】
62 0
|
1月前
|
存储 关系型数据库 MySQL
MySQL技能完整学习列表5、数据库操作——1、创建数据库和表——2、修改表结构(ALTER TABLE)
MySQL技能完整学习列表5、数据库操作——1、创建数据库和表——2、修改表结构(ALTER TABLE)
200 0
|
9月前
|
SQL 关系型数据库 MySQL
MySQL数据库---库基本操作 以及 表结构的操作(DDL)
MySQL数据库---库基本操作 以及 表结构的操作(DDL)
95 3
|
14天前
|
SQL 关系型数据库 MySQL
mysqldiff - Golang 针对 MySQL 数据库表结构的差异 SQL 工具
Golang 针对 MySQL 数据库表结构的差异 SQL 工具。https://github.com/camry/mysqldiff
49 7
|
1月前
|
存储 SQL 关系型数据库
【MySQL进阶之路 | 基础篇】基本的SELECT语句及DESC显示表结构
【MySQL进阶之路 | 基础篇】基本的SELECT语句及DESC显示表结构
|
12天前
|
存储 关系型数据库 MySQL
【MySQL技术内幕】3.3-套接字文件、pid文件和表结构定义文件
【MySQL技术内幕】3.3-套接字文件、pid文件和表结构定义文件
10 0
|
1月前
|
SQL 存储 关系型数据库
【MySQL-6】DDL的表结构的数据类型盘点&案例演示
【MySQL-6】DDL的表结构的数据类型盘点&案例演示
|
6月前
|
存储 关系型数据库 MySQL
MySQL不同版本下表结构和数据存储总结
MySQL不同版本下表结构和数据存储总结
93 0
|
6月前
|
SQL 存储 关系型数据库
MySQL下使用SQL命令进行表结构与数据复制实践
MySQL下使用SQL命令进行表结构与数据复制实践
76 0