背景
业务方要做一个管理平台,在该平台上可以维护系统信息,提供新增、更新、删除等操作。就是我们常说的CRUD
开发,因为对于每个系统来说,系统编号具有唯一性,所以在新增系统时要先校验系统编号是否存在。
开篇提问
1、思考:判断一条记录是否存在有几种方式,哪种方式更合理效率更高?
2、如何判断表中是否有数据?
判断方式
方式一:使用唯一索引
使用唯一索引,插入数据前不判断,通过捕获异常来处理
优点:减少一次数据库操作
缺点:需要处理异常逻辑
相关SQL
-- 建表语句(sys_code设置成唯一索引)
CREATE TABLE `system_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`sys_code` varchar(100) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '系统code'
PRIMARY KEY (`id`),
-- 增加唯一索引
UNIQUE KEY `system_info_union` (`sys_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='系统信息表';
-- 插入语句
INSERT INTO system_info (sys_code) VALUES ('tra')
代码逻辑
MySQLIntegrityConstraintViolationException,违反数据库完整性约束,通过监听该异常判断数据是否重复
/**
* 新增系统接口
*/
public void insertSystemInser(SystemInfo systemInfo) {
try {
systemMapper.insert(systemInfo);
} catch (MySQLIntegrityConstraintViolationException e) {
// 违反数据库唯一索引,说明该数据已存在
System.out.println("重复数据");
}
// 数据成功插入
System.out.println("数据成功插入");
}
方式二:先判断再插入
先判断记录是否存在,如果不存在则插入数据
-- 建表语句(sys_code设置普通索引)
CREATE TABLE `system_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`sys_code` varchar(100) COLLATE utf8mb4_bin NOT NULL DEFAULT '' COMMENT '系统code'
PRIMARY KEY (`id`)
-- 增加BTREE索引
KEY `sys_code_idx` (`sys_code`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='系统信息表';
使用count(1)或count(*)查询数量
注意:此方式需要有where条件,否则会做全表扫描,并且where条件是索引字段
select count(*) from system_info where sys_code = 'xxx';
或
select count(1) from system_info where sys_code = 'xxx';
使用limit查询数量
如果没有where条件,需要判断数据表中是否有数据,使用
limit
作为查询限制
select 1 from system_info limit 1;
代码逻辑
public void insertSystemInser(SystemInfo systemInfo) {
// 查询数量
int count = systemMapper.count();
if (count >= 0) {
System.out.println("数据重复");
} else {
// 插入数据
systemMapper.insert(systemInfo);
System.out.println("插入成功");
}
……
}