引言
一些对表结构的修改操作是日常数据库操作中非常低频的,这就好像盖完了一栋楼之后,很少会去动地基,不过这种情况在实际开发当中并非完全没有可能,因此,此篇博客主要总结表结构修改相关的语句。
一、备份表
如果要执行一些修改表结构的操作,建议可以先对表整体进行备份:
CREATE TABLE old_table_bak SELECT * FROM old_table;
注意 ,备份生成的表不会有主键和自增等信息,需要重新添加。
二、修改表名
两种语句:
ALTER TABLE old_table_name RENAME new_table_name;
RENAME TABLE old_table_name TO new_table_name;
三、修改字符集
推荐的字符集是 utf8编码,但在某些情况下可能还会要求使用GBK或者 GB2312等。
ALTER TABLE table_name CHARSET gbk;
# 或
ALTER TABLE table_name CHARSET gb2312;
四、清空表数据
高危操作,谨慎执行!
DELETE FROM table_name;
delete from 操作会一条一条进行删除,还有一种更快速的删除: TRUNCATE:
TRUNCATE table_name;
4.1 DELETE 与 TRUNCATE 在事务中的区别
关闭自动提交,开启事务,执行 DELETE 语句。
SET autocommit = 0;
DELETE FROM emp_bak;
再执行 ROLLBACK 语句:
ROLLBACK;
可以成功回滚。
再次开启事务,执行 TRUNCATE 语句:
TRUNCATE emp_bak;
执行回滚,ROLLBACK,但是数据仍然没有恢复。可见,TRUNCATE 一旦执行,则不可逆,因此在实际工作中,一定要慎用该SQL。
五、删表
高危操作,谨慎执行!
DROP TABLE IF EXISTS table_name;
六、修改表字段
6.1 修改字段类型
将表中的某个字段的类型修改,并且设置为非空:
ALTER TABLE table_name MODIFY column_name VARCHAR(50) NOT NULL;
6.2 修改字段名字
将表中的某个字段名称修改,并且设置为非空:
ALTER TABLE table_name CHANGE old_column_name new_column_name CHAR(30) NOT NULL;
实际上,MODIFY 和 CHANGE 的区别并不十分明显。
MODIFY 主要用来修改字段属性和约束,无法重命名字段。
CHANGE 主要用来修改字段的名称,可以同时修改属性和约束,但前提是必须要进行重命名操作,如果不希望修改名称又想用CHANGE 关键字,那么可以重命名为旧名称,即:
ALTER TABLE table_name CHANGE old_column_name old_column_name CHAR(30) NOT NULL;
另外注意,NOT NULL 非空约束在不写的情况下是会变为允许为NULL 的。因此,如果你想修改某个字段的类型或者名称,但不想修改 非空约束,那么就必须在修改语句中加 NOT NULL ,否则该字段将被置为允许为 NULL。
6.3 添加字段
在表最后追加一个字段,默认为NULL:
ALTER TABLE table_name ADD new_column SMALLINT DEFAULT NULL;
在表中指定位置新增一个字段:
ALTER TABLE table_name ADD new_column VARCHAR(50) DEFAULT NULL COMMENT '品类编号' AFTER id;
在表头加入一个新字段:
ALTER TABLE table_name ADD new_column VARCHAR(50) DEFAULT NULL FIRST;
6.4 删除字段
ALTER TABLE table_name DROP column_name;
七、主键的维护
7.1 删除主键约束和自增
删除主键之前要确保该主键是非自增的,否则无法删除主键,我们使用AUTO_INCREMENT 来约束自增,和 NOT NULL一样,如果不写,那么就会变为非自增:
ALTER TABLE table_name MODIFY id INT NOT NULL;
然后删除主键约束:
ALTER TABLE table_name DROP PRIMARY KEY;
7.2 添加主键和自增
除了在建表的时候指定主键和自增,我们还可以通过下面的方式指定主键和自增:
ALTER TABLE table_name ADD PRIMARY KEY (id);
ALTER TALBE table_name MODIFY id INT NOT NULL AUTO_INCREMENT;
我们也可以将主键和自增一起指定:
ALTER TABLE table_name MODIFY id INT NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY (id);