事务
- innodb支持事务,在执行事务的时候会记录事务日志
事务的特性:
- 原子性:要么都执行,要么都不执行
- 一致性:保证数据业务上一致。数据库的完整性没有被破坏。表示写入的资料必须完全符合所有的预设规则
- 持久性:一旦事务提交,对数据的修改是永久的
- 隔离性:不同事务间相互隔离,在并发情况下不会因为交叉执行导致数据不一致
- 如果两个事务同时修改一个表,可能会导致其中一个修改挂起
手动开启:
- begin 或者 start transaction
- rollback
- commit
自动开启
SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交
delete truncate drop
- | delete | truncate | drop |
---|---|---|---|
每次删除条数 | 每次删除一行 | 所有数据 | 所有数据 |
是否记录事务 | 是(需要提交事务后才能生效,可以回滚) | 否(不能回滚) | 否(不能回滚) |
语句类型 | DML | DDL | DDL |
是否触发触发器 | 是 | 否 | 否 |
执行后空间大小 | 不会减少表或索引所占用的空间 | 恢复到初始大小 | 表所占用的空间全释放掉 |
执行速度 | 慢 | 较快 | 快 |
执行对象 | table、view | table | table、view |
删除内容 | 只删除数据 | 只删除数据(表结构及其列、约束、索引等保持不变) | 整个表(结构、数据、约束(constrain),触发器(trigger)索引(index)) |
FOREIGN KEY 约束的表 | 支持 | 不支持 | ?? |
是否支持where | 支持 | 不支持 | 不支持 |
- truncate为什么比delete快:delete每次只删除一行,每行记录事务日志,truncate释放存储表数据所用的数据页来删除数据
- delete会记录事务日志,同时也会记录二进制日志。drop和truncate只会记录二进制日志
- 二进制日志也叫作变更日志,主要用于记录修改数据或有可能引起数据改变的mysql语句,主要用于数据库恢复和主从复制
日志:http://www.mamicode.com/info-detail-2087669.html
delete、truncate、drop:https://www.cnblogs.com/zhizhao/p/7825469.html
外键
- t2上有外键,t1为外键主表,外键主表t1上不能使用truncate,t2上可以使用truncate
- t2的t_id上有外键,即使没有索引,也会在t_id上建立索引
CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`createtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `t2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`t_id` int(11) DEFAULT NULL,
`createtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
constraint `fk` foreign key (`t_id`) references `t1`(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
预编译
prepare prep from "select count(*) from test2";
prepare pre2 from "select * from test2 where a=?";
set @a="select * from test2";
prepare pre1 from @a;execute pre1;
prepare pre3 from "select * from test2 where a=? and b=?";
- 执行
execute prep;
set @a=10;execute pre2 using @a;
execute pre3 using @a,@b;
- 删除
drop prepare pre3;
https://blog.youkuaiyun.com/chinayuy/article/details/5425886