我看到了那天的夕阳,美得如此骄艳,我便决定,追寻夕阳,拼尽余生。
上一章简单介绍了 MySQL创建表和约束条件(四),如果没有看过,请观看上一章
在我们创建好表之后,并不是不能再次对表的结构进行相应修改了,可以通过 DDL 语句对其进行相应的维护,进行适当的修改。 但老蝴蝶仍然建议,在设计表的时候,尽量将表设计的合理一些,避免后期对其进行修改。
老蝴蝶这一章所使用的表,用的是第四章的表,数据库仍然是yuejl 数据库。
一. 维护表
对表 table 的整体信息进行相应的维护。
一.一 修改表名
1 . 第一种方式
所用命令:
alter table 旧表名 rename [to] 新表名
其中, to 可以省略。 但不建议省略。
演示修改表名:
如 将 表名为 t2 的修改成 yjlt2;
alter table t2 rename to yjlt2;
再次查询: show tables;
2 . 第二种方式
所用命令:
rename table 旧表名 to 新表名
演示修改表名:
如将表名 为t 的修改成 yjlt;
rename table t to yjlt;
一.二 修改表的编码格式
所用命令:
alter table 表名 character set 新的编码方式
演示 修改表的编码格式。 如将t3的编码格式修改成 latin1
1 . 原先的t3 表的样式
2 . 将t3的编码样式修改成 latin1
alter table t3 character set latin1;
3 . 再次查看样式
一.三 修改表的存储引擎
MySQL中不同的存储引擎,支持不同的功能。 5.5 之后的存储引擎 默认为 InnoDB, 之前的是 MyISAM.
支持的存储引擎有:
存储引擎名 |
是否支持 |
InnoDB |
默认 |
MyISAM |
是 |
FEDERATED |
是 |
MRG_MYISAM |
是 |
BLACKHOLE |
是 |
CSV |
是 |
MEMORY |
是 |
ARCHIVE |
是 |
PERFORMANCE_SCHEMA |
是 |
关于存储引擎,老蝴蝶后面再详细讲解。
所用命令:
alter tabel 表名 engine= 新的存储引擎
演示 修改表的存储引擎。 仍然以t3 表为便。 原先的是 engine=InnoDB, 现在改成 MyISAM.
alter table t3 engine=MyISAM;
再次查看:
一.四 删除表
所用命令:
drop table [if exists] 表名1,表名2,表名3
删除表的时候, 可以删除一个,也可以一次删除多个。
一.四.一 删除单个表
演示删除表: 如 删除表 yjlt;
drop table yjlt;
再次查询: show tables;
发现,记录变成了13行,已经没有 yjlt 这个表了。
一.四.二 删除多个表
如同时删除 a12,d10,d11 三个表。
drop table a12,d10,d11;
一.四.三 删除一个不存在的表
如 删除表 yuea, 这个表不存在于这个数据库 yuejl 里面。
删除:
drop table yuea;
会报错。 为了避免这种报错, 通常 添加 if exists, 这样当删除一个不存在的表时,就不会报错了。
drop table if exists yuea;
一.四.四 删除有外键关联的主表
user 表和 dept 表存在着外键关联信息, 即user 表里面的deptId 引用于 dept 表中的 id主键。 当想直接删除 dept表时,会报错。
drop table dept;
需要先解除 user 表与 dept 表的外键关联信息,才能进行删除。
关于如何删除外键约束, 会在下面内容进行讲解。
一.五 清空表
所用命令:
truncate table 表名
清空表演示: 用自动增长的 a12 表。
1 . 原先的表 a12 的信息
下一条记录 id=3.
2 . 清空表a12
truncate table a12;
3 . 再次查询数据
发现,数据是空的了。
4 . 查询一下 ,现在表a12 的信息
发现,表的信息a12 没有任何改变。
5 .再次插入一条数据,不指定id, 让其自动增长, 再次查询
insert into a12(name) values('两个蝴蝶飞');
发现,编号仍然是从 id=1 开始。
truncate 清空表,就相当于快速创建一个 与原来结构一模一样的表, 序列,自动增长等,均是最开始的模样。
二. 维护表字段
维护字段的信息,主要就是 添加字段,修改字段的类型,顺序, 删除字段等。
新添加一个表 yjlCol, 对这个表进行相应的字段操作
create table yjlCol(
id int(11),
name varchar(20),
sex varchar(10)
);
二.一 添加字段 用add
添加一个完整的字段, 包括 字段名,数据类型,完整性约束。 对于一个已经创建好的表 添加字段来说, 还需要指定一下所放置的顺序。
所用命令:
alter table 表名 add 新字段名 数据类型 [约束条件] [first|after 已经存在的字段名]
其中,顺序可以不指定。 如果不指定顺序的话,默认是 放置在最后一个。 约束条件,只能是列级别约束。
二.一.一 添加无约束的字段 description, 类型是 varchar(100)
alter table yjlCol add description varchar(100);
二.一.二 添加有约束字段 age, 类型是 int(11), 不为空。
alter table yjlCol add age int(11) not null;
二.一.三 添加一个新的字段 yId, 类型是 int(11), 是主键,放置在最开始的位置。
alter table yjlCol add yId int(11) primary key auto_increment first;
二.一.四 添加一个新的字段 ysex, 类型是 varchar(10), 唯一约束, 放置在 sex 之后。
alter table yjlCol add ysex varchar(10) unique after sex;
二.一.五 添加字段时,关于主键问题:
1 . 现在表 yjlCol 已经有主键了, 那么再新添加一个主键呢? yyId 。 会报错的。
alter table yjlCol add yyId int(11) primary key first;
2 . 将这个表 yjlCol 删除掉, 再重新创建 yjlCol, 仍然用最开始的那条语句, 只有id,name,sex 三个字段。
drop table yjlCol;
删除之后,重新创建表。
create table yjlCol(
id int(11),
name varchar(20),
sex varchar(10)
);
3 . 添加一个字段 yId, 是not null, unique 约束,但不是主键, 放置在最开始的位置。 现在表 yjlCol 没有主键。
alter table yjlCol add yId int(11) not null unique first;
,
是创建成功的。
用 show create table yjlCol 展示信息:
用 desc yjlCol 展示信息:
发现,会将新添加的yId 当成主键。
这是因为 没有主键的原因。
4 . 新添加一个主键 yyId , primary Key int(11) 类型。
alter table yjlCol add yyId int(11) primary key first;
可以正常的添加。
这个时候,再 desc yjlCol 展示信息:
这个时候, 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)
2 . 改变类型。 举例: 将sex 的varchar(5) 变成 int(2).
性别以前存储的是 汉字, 男或者女。 现在存储数字, 1代表男,2代表女。
alter table yjlCol modify sex int(2);
3 . 修改一个不存在的列名 , 如age 的类型为 int(3). 发现是错误的
alter table yjlCol modify age int(3);
4 . 修改时添加约束。 如 name 时 为不为空 约束。 这样添加约束是可以的。
alter table yjlCol modify name varchar(20) not null;
二.二.二 修改字段名/修改列名 change
只可以修改列名。将一个列名,变成新的列名。
命令:
alter table 表名 change 旧字段名 新字段名 新数据类型
注意, 新的数据类型 一定要存在,不能省略。
1 .演示: 将name 变成 yname, 数据类型还是以前的数据类型
alter table yjlCol change name newName varchar(20);
2 . 演示: 将sex 变成 newSex, 数据类型由以前的 int(2) 变成 varchar(10)
alter table yjlCol change sex newSex varchar(10);
3 当旧字段名与 新的字段名相同时, 表示只修改数据类型, 达到 二.二.一 部分的功能。
如 newSex 变成 newSex, 类型 变成 int(2)
alter table yjlCol change newSex newSex int(2) ;
二.二.三 修改字段的顺序 modify
改变一下, 表中各个列的顺序。
命令:
alter table 表名 已经存在的字段 数据类型 first| after 已经存在的字段名
其中,注意到, 如果将后面的 顺序 first|after 已经存在的字段名 去除掉,就是 二.二.一 的部分内容。
1 . 将 newSex 放置在最前面 (没有修改数据类型)
alter table yjlCol newSex int(2) first;
2 . 将 newSex 重新放置到 newName 的后面 (没有修改数据类型)
alter table yjlCol modify newSex int(2) after newName;
3 . 将 newSex 放置到 最前面, 并且改变数据类型 为varchar(10)
alter table yjlCol modify newSex varchar(10) first;
二.三 删除字段 drop
命令:
alter table 表名 drop 已经存在的列名
1 . 如 删除表 yjlCol 里面的 newSex 字段 (newSex 不是主键)
alter table yjlCol drop newSex
2 . 将 yjlCol 的id 变成主键,删除再删除 id, 验证一下主键的字段是否能够删除
alter table yjlCol modify id int(11) primary key auto_increment;
alter table yjlCol drop id;
注意,以上字段的 修改和删除部分,在表 yjlCol 里面是没有数据的。 如果有数据的话,修改 类型时, sex 原先是 varchar(10), 存放的是 ‘男’ 或者 ‘女’, 现在修改时突然变成了 int(2), 这个时候肯定是错误的, 是不让修改的。 删除主键时, 表里面的两条数据除了id 不一样外,全部都一样, 你删除了 id, 那么这两条记录就完全一致了,是不能删除这个字段的。 还有, 记录里面有 两条记录, name值相同, 你将name的约束改成 unique 唯一, 这样也是错误的。 故,老蝴蝶建议 一定要在设计之初就仔细分析,创建表, 不要在有了数据之后,再进行维护表的字段信息。 下面的约束条件,也是有这样的问题的。
三. 维护约束条件
也同样, 像 二.二 部分开始的那样, 先删除 表 yjlCol, 再重新建表 yjlCol, 用最纯净的表来进行演示。
将这个表 yjlCol 删除掉, 再重新创建 yjlCol, 仍然用最开始的那条语句, 只有id,name,sex 三个字段。
drop table yjlCol;
删除之后,重新创建表。
create table yjlCol(
id int(11),
name varchar(20),
sex varchar(10)
);
关于表的维护条件, 主要分为四大类, 一类是 关于主键的, 一类是关于外键的, 一类是关于 非空,默认,自动增长 这样的, 一类是 唯一约束。
下面针对的,都是已经创建好的表,不需要修改字段的。 只需要添加约束的。 如果要修改字段的同时再添加约束, 可以参考 上面的第二段内容,将表的字段维护好之后,再进行维护约束。
三.一 非空,默认,自动增长 约束条件
三.一.一 添加 非空 约束条件
如 name 字段添加 唯一的约束。 用 modify 修改数据类型,后面 添加约束
alter table yjlCol modify name varchar(10) not null;
三.一.二 删除唯一 约束条件
如 name 字段 删除 唯一约束 用 modify 修改数据类型, 后面不添加约束
alter table yjlCol modify name varchar(10);
三.二 唯一约束条件
如 name 字段, 添加 唯一约束
三.二.一 添加唯一约束
可以用
alter table yjlCol modify name varchar(10) unique;
但不建议这么使用。 唯一约束,有专门的方法, 主键也是,外键也是, 均用自己专门的方法。
建议命令使用:
alter table 表名 add [constraint 唯一约束名] Unique [Key] (列名);
key 可以加也可以不加。
演示:
alter table yjlCol add unique (name);
三.二.二 删除唯一约束
命令:
alter table 表名 drop index 列名;
会变成 索引 index
演示:
alter table yjlCol drop index name;
三.三 主键约束条件
三.三.一 添加单个主键
可以用 上面的语句:
alter table yjlCol modify id int(11) primary key;
来进行添加主键。
但不建议使用, 建议使用下面的命令:
alter table 表名 add [constraint 主键约束名] primary key (列名)
演示:
alter table yjlCol add primary key(id);
三.三.二 删除主键约束
命令:
alter table 表名 drop primary key;
演示:
alter table yjlCol drop primary key;
老蝴蝶提示:删除时,如果该主键是自增长的话, 那么需要先按照 三.一 的部分先删除自增长,然后才能 用 三.三.二 的部分 删除主键。
自增长的主键的话,直接删除的报错信息。
应该先删除自动增长, 再删除主键。
alter table yjlCol modify id int(11);
alter table yjlCol drop primary key;
三.三.三 添加 复合主键约束
命令:
alter table 表名 add constraint 主键约束名 primary key (列名1,列名2);
如 给 yjlCol 中 id,name 添加联合主键。
alter table yjlCol add constraint PK_YJLCOL primary key(id,name);
三.三.四 删除 联合主键
用 上面 的 三.三.二 语句时:
alter table yjlCol drop primary key;
是可以正常 删除 联合主键的。
三.四 外键 Foreign Key
还是用 上一章节的 dept 表。 有id 和name 两个属性。
在 yjlCol 表里面添加一个 deptId 的字段, Int(11) 类型, 放置在最后。
alter table yjlCol add deptId int(11);
三.四.一 添加外键
命令:
alter table 子表名 add constraint 外键名 foreign key(子表字段) references 父表名(字段);
演示:
alter table yjlCol add constraint FK_YJLCOL_deptId foreign key(deptId) references dept(id);
三.四.二 删除外键
命令:
alter table 子表名 drop foreign key 外键名
演示:
alter table yjlCol drop foreign key FK_YJLCOL_deptId;
一.四.四 (删除有外键关联的主表)
1 .user 表的 外键信息是: 外键名称是 fk_user_deptId
2 . 删除 user 表里面的外键信息
alter table user drop foreign key fk_user_deptId;
3 .然后再删除主表 dept, 可以正常的进行删除了。
drop table dept;
关于表的操作,基本上就这么多。 谢谢!!!