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("插入成功");
	}
	……
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用Java中的JDBC连接MySQL数据库,然后使用SQL语句查询是否存在对应的记录。 以下是一个简单的示例代码: ```java import java.sql.*; public class CheckExistence { public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; String input = "example"; try { // 加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); // 获取数据库连接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password"); // SQL语句 String sql = "SELECT * FROM table_name WHERE column_name = ?"; // 创建PreparedStatement对象 ps = conn.prepareStatement(sql); // 设置参数 ps.setString(1, input); // 执行查询操作 rs = ps.executeQuery(); // 判断是否存在对应的记录 if (rs.next()) { System.out.println("存在该记录"); } else { System.out.println("不存在该记录"); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { // 释放资源 try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } } ``` 其中,`com.mysql.jdbc.Driver`是MySQL数据库的驱动类,需要事先下载并导入到项目中。`test`是数据库名,`root`和`password`分别是数据库的用户名和密码。`table_name`和`column_name`需要替换成对应的表名和列名。`input`是需要查询的内容,可以根据具体情况进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值