本文不去讲CRUD的基础知识,我们来换个姿势聊一聊CRUD操作。
我想很多人可能会面临下面这些问题:
- 批量插入数据,一条失败全部回滚,但想忽略失败的数据继续插入怎么办?
- 数据存在时更新数据,不存在时插入数据,一定要在每次插入数据之前读一次数据库进行判断吗,批量插入时又怎么办?
- 子查询有没有可能带来性能问题?什么是相关子查询?如何解决相关子查询性能问题?
- 多表连接查询,一个相同的查询条件写在WHERE子句和写在连接条件子句中有何区别?
- UPDATE操作可以使用表连接吗?可以同时更新多张表吗?
- DELETE操作可以使用表连接吗?可以同时删除多张表吗?
接下来,我们直接进入正题。
1. 批量插入,忽略插入失败的数据
有一个部门表,表结构如下:
CREATE TABLE `t_dept` (
`deptno` int NOT NULL,
`dname` varchar(20) DEFAULT NULL,
`loc` varchar(20) DEFAULT NULL,
PRIMARY KEY (`deptno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
里面有这几条原始数据
INSERT INTO `t_dept` VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO `t_dept` VALUES (20, 'RESEARCH', 'DALLAS');
INSERT INTO `t_dept` VALUES (30, 'SALES', 'CHICAGO');
INSERT INTO `t_dept` VALUES (40, 'OPERATIONS', 'BOSTON');
往部门表批量插入数据的常规写法:
INSERT INTO t_dept(deptno,dname,loc) VALUES
(40,'企划部','北京'),
(50,'培训部','上海'),
(60,'后勤部','北京'),
(70,'技术部','北京'),
(80,'市场部','北京')
deptno是t_dept表中的主键id,假设t_dept表中原来就存在deptno=40的数据。则在执行插入 (40,‘企划部’,‘北京’) 这条记录时会遇到错误,从而回滚事务,其所带来的结果便是一条数据都没有被插入。
如果你想要插入数据时忽略错误,可以用IGNORE关键字:
INSERT IGNORE INTO t_dept(deptno,dname,loc) VALUES
(40,'企划部','北京'),
(50,'培训部','上海'),
(60,'后勤部','北京'),
(70,'技术部','