MySQL后记
这篇博客的目的是记录一些容易被忽略的MySQL的知识点,以及部分pymysql模块的注意点。
MySQL中的DDL与DML
- DDL:数据定义语言(Data Definition Language),主要为create、alter、drop、truncate语句。
- DML:数据操控语言(Data Manipulation Language),包括:insert、update、delete。注意,select语句属于DQL(Data Query Language)。
这两个是我们接触最多的sql语言,除此之外还有数据控制语言(DCL)和事务控制语言(TCL),对于事务来说,DDL语句是立刻执行、无法回滚(rollback)的,DML只有提交(commit)了才会生效。
被忽略的“if not exists”
现在有一个sql脚本,里面的部分建表语句我们已经执行过了该怎么办呢?
# 可以使用以下语句忽略已经建好的表
create table `tablename` if not exists (fields) ;
# 若是已经存在,会有一条warning
show warnings;
不过这样的语句在pymysql
模块中会抛错。
处理重复数据
在我们实际项目中很可能会遇到很多的重复数据,那么我们如何处理这些重复数据呢?
-
忽略:
insert ignore into `tablename` values(...);
-
替换:
raplace into ...; """ 这样做实际上会有两条记录受影响 1: 先删除原有数据 2:再插入后来的数据 """
-
更新:
insert into t1 (a,b,c) values (1,2,3) on duplicate key update c=c+1; # 等同于 update t1 set c=c+1 where a=1; # 如果b也是唯一的 update t1 set c=c+1 where a=1 or b=2 limit 1;
mysql8的更新
-
无法在赋与权限的同时创建用户了!
# 8.0之前: grant 权限们 on 数据库名.表名 to 用户名@主机名 identified by '密码'; # 8.0后 无法一步完成了 create user 用户名@主机名 identified by '密码'; grant 权限们 on 数据库名.表名 to 用户名@主机名 with grant option;
-
以后将取消
float(M,D)
以及double(M,D)
语法。 -
以后将取消浮点型的
auto_incremen
设置。 -
不推荐使用
zerofill
。
补充:rlike
等同于regexp