mysql判断数据库记录是否存在

背景

业务方要做一个管理平台,在该平台上可以维护系统信息,提供新增、更新、删除等操作。就是我们常说的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("插入成功");
	}
	……
}

你可能感兴趣的:(数据库应用,数据库,mysql,sql)