3.2 修改字段
对表的字段进行修改,可以修改字段的数据类型、长度、默认值、位置等。
一般修改字段不会修改字段的数据类型,修改字段的数据类型很可能影响原本的数据。
语法:
ALTER TABLE 表名 MODIFY [COLUMN] 字段名1 字段类型 [DEFAULT 默认值] [FIRST|AFTER 字段名 2];
3.2.1 修改字段的长度
ALTER TABLE myemp1 # 将emp_name字段的长度修改为25 MODIFY emp_name VARCHAR(25); DESC myemp1;
3.2.2 修改字段的同时设置默认值
ALTER TABLE myemp1 # 将emp_name字段的长度修改为35 # 同时指定默认名字为张三 MODIFY emp_name VARCHAR(35) DEFAULT '张三'; DESC myemp1;
3.2.3 修改字段的位置
ALTER TABLE myemp1 # 将emp_name字段的长度修改为25 # 同时字段位于phone_num之后 # 不能单独设置字段的位置,即不能只写AFTER phone_num MODIFY emp_name VARCHAR(25) AFTER phone_num; DESC myemp1;
3.3 重命名字段
语法:
ALTER TABLE 表名 CHANGE [column] 列名 新列名 新数据类型;
ALTER TABLE myemp1 CHANGE salary monthly_salary double(10,2); DESC myemp1;
3.4 删除字段
语法:
ALTER TABLE 表名 DROP [COLUMN] 字段名
ALTER TABLE myemp1 DROP phone_num; DESC myemp1;
4. 重命名表
4.1 方式一:RENAME
语法:
RENAME TABLE 旧表名 TO 新表名;
RENAME TABLE myemp1 TO emp1; SHOW TABLES;
4.2 方式二:ALTER
语法:
ALTER table 要修改的表 RENAME [TO] 新表名
ALTER TABLE emp1 RENAME myemp1; SHOW TABLES;
5. 删除表
语法:
DROP TABLE [IF EXISTS] 数据表1 [, 数据表2, …, 数据表n];
USE atguigudb; DROP TABLE IF EXISTS employees_blank; SHOW TABLES;
数据表删除之后,不能撤销删除操作。
不光将表结构删除掉,同时表中的数据也删除掉,释放表空间。即数据和结构都被删除。
6. 清空表
清空表,表示清空表中的所有数据,但是表结构保留。
语法:
TRUNCATE TABLE 表名;
TRUNCATE TABLE employees_copy; SELECT * FROM employees_copy;
6.1 TRUNCATE TABLE与DELETE FROM的对比
- 相同点:
- 都可以实现对表中所有数据的删除,同时保留表结构。
- 不同点:
- TRUNCATE TABLE:一旦执行此操作,表数据全部清除。同时,数据是不可以回滚的。
- DELETE FROM:一旦执行此操作,表数据可以全部清除(不带WHERE)。同时,数据是可以实现回滚的(COMMIT之前)。
7. DCL中的COMMIT与ROLLBACK
- COMMIT:
- 提交数据。
- 一旦执行COMMIT,则数据就被永久的保存在了数据库中,意味着数据不可以回滚。
- ROLLBACK:
- 回滚数据。
- 一旦执行ROLLBACK,则可以实现数据的回滚。回滚到最近的一次COMMIT之后。
阿里开发规范:
【参考】TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少,但 TRUNCATE 无事务且不触发 TRIGGER,有可能造成事故,故不建议在开发代码中使用此语句。
说明:TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同。
8. DDL 与 DML 说明
- DDL
- DDL的操作一旦执行,就不可回滚。
- 指令
SET autocommit = FALSE
对DDL操作失效。(因为在执行完DDL操作之后,一定会执行一次COMMIT。而此COMMIT操作不受SET autocommit = FALSE
影响的。)
- DML
- DML的操作默认情况,一旦执行,也是不可回滚的。DML执行完成默认会执行一次COMMIT。
- 如果在执行DML之前,执行了
SET autocommit = FALSE
,则执行的DML操作就可以实现回滚。
8.1 演示
8.1.1 DML
# 为了避免之前的操作造成影响,先提交一次 COMMIT;
# 查询myemp3中的数据 SELECT * FROM myemp3;
# 取消DML操作的自动提交 SET AUTOCOMMIT = FALSE;
# 使用DELETE FROM清空myemp3中的数据 DELETE FROM myemp3;
# 再次查询myemp3 SELECT * FROM myemp3;
# 进行数据的回滚 ROLLBACK;
# 再次查询myemp3 # 由于没有提交清空操作所以可以进行数据的回滚 SELECT * FROM myemp3;
在执行DML之前,执行了
SET autocommit = FALSE
,则执行的DML操作就可以实现回滚。
8.1.2 DDL
# 为了避免之前的操作造成影响,先提交一次 COMMIT; # 查询myemp3中的数据 SELECT * FROM myemp3;
# 取消DML操作的自动提交 SET AUTOCOMMIT = FALSE; # 使用TRUNCATE TABLE清空myemp3中的数据 TRUNCATE TABLE myemp3; # 再次查询myemp3 SELECT * FROM myemp3;
# 进行数据的回滚 ROLLBACK; # 再次查询myemp3 # 由于执行的为DDL操作,所以不能进行数据的回滚 SELECT * FROM myemp3
DDL的操作一旦执行,就不可回滚。且指令
SET autocommit = FALSE
对DDL操作无效。
9. 阿里MySQL命名规范
- 【 强制 】表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑。
- 正例:aliyun_admin,rdc_config,level3_name
- 反例:AliyunAdmin,rdcConfig,level_3_name
- 【 强制 】禁用保留字,如 desc、range、match、delayed 等,请参考 MySQL 官方保留字。
- 【 强制 】表必备三字段:id, gmt_create, gmt_modified。
- 说明:其中 id 必为主键,类型为BIGINT UNSIGNED、单表时自增、步长为 1。gmt_create, gmt_modified 的类型均为 DATETIME 类型,前者现在时表示主动式创建(最开始[第一次]添加数据的时间),后者过去分词表示被动式更新(后期对数据进行修改的时间)
- 【 推荐 】表的命名最好是遵循 “业务名称_表的作用”。
- 正例:alipay_task 、 force_project、 trade_config
- 【 推荐 】库名与应用名称尽量一致。
- 【参考】合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检索速度。
- 正例:无符号值可以避免误存负数,且扩大了表示范围。
10. MySQL8新特性—DDL的原子化
在MySQL 8.0版本中,InnoDB表的DDL支持事务完整性,即 DDL操作要么成功要么回滚 。
CREATE DATABASE mytest; USE mytest; CREATE TABLE book1( book_id INT , book_name VARCHAR(255) ); SHOW TABLES;
由于删除两种表为同一个事务,在MySQL 8.0版本中,InnoDB表的DDL支持事务完整性,所以删除第二个表失败时会进行事务的回滚,撤销对表1的删除。因为在删除表2失败时并没有整个事务执行成功,所以会回滚。