二. 维护表字段
维护字段的信息,主要就是 添加字段,修改字段的类型,顺序, 删除字段等。
新添加一个表 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 唯一, 这样也是错误的。 故,老蝴蝶建议 一定要在设计之初就仔细分析,创建表, 不要在有了数据之后,再进行维护表的字段信息。 下面的约束条件,也是有这样的问题的。