java实现向主键id自增的表中插入数据

本文介绍了如何在Java中向使用主键自动递增的MySQL表中插入数据,避免手动设置主键导致的工作量增加和重复键错误。通过调整数据库配置和代码实现,成功解决问题,确保愉快地进行数据库操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题
  • 想要向mysql数据库中插入一条记录,因为设计的表时自动递增的,那么如果插入多条记录,每次都要设置主键的话工作量会很大,而且难免会有重复的主键,这时候就要使用强大的主键自增的功能了。
在没有使用主键自增时的代码是这样子的
String insertSQL = "insert into user_t values(1, 'zzz', 'aaa', 20);";
statement = connection.prepareStatement(insertSQL);
statement.executeUpdate();

难免会报这样的错:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '1' for key 'PRIMARY'
在使用主键自增功能之后的代码:
String insertSQL = "insert into user_t(user_name, password, age) values(?, ?, ?)";              

statement = connection.prepareStatement(insertSQL, PreparedStatement.RETURN_GENERATED_KEYS);

statement.setString(1, "zzz");
statement.setString(2, "aaa");
statement.setInt(3, 21);

statement.execute();

ResultSet rs = statement.getGeneratedKeys();

int id = 0;

if (rs.next()) {
    id = rs.getInt(1);
}

但是又会报这样的错:

java.sql.SQLException: Field 'id' doesn't have a default value
完美解决方案:
  • 在my.ini文件中修改配置
#sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION" (注释掉)
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
  • 查看数据库表是否设计为自动递增
    这里写图片描述
剩下的就是愉快的玩耍啦!!

祝大家編程路上一帆风顺

<think>好的,用户现在想知道如何在MySQL中向带有自主键插入数据。之前他们问过如何修改列名,现在转向数据插入,可能是在设计结构后需要填充数据。需要结合之前的引用内容,特别是引用1、4、5,这些提到了自主键的使用和插入数据的方法。首先,用户可能对自主键的机制不太清楚,需要解释如何正确插入数据而不指定主键。根据引用1中的例子,当不使用自时,代码需要手动设置主键,但这样容易出错。因此,正确的做法是在插入时忽略主键列,让数据库自动生成。 然后,用户可能关心插入后如何获取生成的自ID,引用4提到了多种方法,比如使用LAST_INSERT_ID()或者@@identity,需要详细说明这些方法的使用场景和注意事项。另外,引用5提到使用自主键的性能优势,可以提醒用户为什么推荐使用自而非UUID,尤其是在大数据量下的效率问题。需要分步骤讲解,先说明基本语法,再给出示例,然后讨论获取自ID的方法,最后注意事项和相关问题。注意引用标记的正确使用,比如在解释插入语法时引用示例中的代码,提到获取ID时引用引用4的内容。还要注意用户可能的误区,比如在插入时指定主键值可能导致的问题,或者是否需要显式设置自列。需要强调在插入语句中应省略自列,除非有特殊需求。 最后生成相关问题,可能涉及批量插入、性能优化、主键选择等,参考之前的引用内容中的知识点,比如引用3提到的自ID不连续的问题,引用5中的自与UUID比较,以及如何设计高效的结构。</think>### 在MySQL中向自主键插入数据的完整指南 --- #### **核心方法** 当主键设置为自(`AUTO_INCREMENT`)时,插入数据**不需要手动指定主键值**。以下是两种标准插入方式: ```sql /* 方式1:显式指定列名(推荐) */ INSERT INTO 名 (列1, 列2, 列3) VALUES ('数据1', '数据2', '数据3'); /* 方式2:不指定自列 */ INSERT INTO 名 VALUES (DEFAULT, '数据1', '数据2', '数据3'); -- 使用DEFAULT占位符[^1] ``` --- #### **实践示例** 假设结构如下(id主键列): ```sql CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT ); ``` **正确插入操作**: ```sql INSERT INTO users (name, age) VALUES ('张三', 25); -- 忽略id列,数据库自动生成[^1] ``` --- #### **获取自主键值的方法** 插入后可通过以下方式获取新生成的主键ID: | 方法 | SQL语句 | 特点 | |--------------------------|----------------------------------|----------------------------------------------------------------------| | `LAST_INSERT_ID()` | `SELECT LAST_INSERT_ID();` | 获取当前会话最后插入的自ID,不受其他会话影响[^4] | | `@@identity` | `SELECT @@identity;` | 全局变量,需在插入后立即查询且保持连接[^4] | | JDBC API | `statement.getGeneratedKeys()` | 通过Java程序获取(参考引用[1]中的JDBC实现) | --- #### **关键注意事项** 1. **禁止手动指定自列** 显式插入主键值会导致自序列中断: ```sql INSERT INTO users VALUES (100, '李四', 30); -- 后续插入将从101开始自[^3] ``` 2. **批量插入优化** 批量插入时建议明确列名: ```sql INSERT INTO users (name, age) VALUES ('王五',28), ('赵六',32); -- 生成连续自ID[^3] ``` 3. **性能影响** 自主键的物理有序性可提升插入性能(对比UUID主键减少磁盘碎片)[^5] --- #### **设计建议** 1. **自步长配置** 通过`auto_increment_increment`调整自步长,适合分库分场景: ```sql SHOW VARIABLES LIKE 'auto_inc%'; -- 查看当前配置 ``` 2. **复合主键处理** 如需使用联合主键,建议仍保留自列作为逻辑主键: ```sql CREATE TABLE orders ( order_id INT AUTO_INCREMENT, user_id INT, PRIMARY KEY (order_id, user_id) ); ``` --- ### 常见问题解决方案 **Q:插入后如何立即获取自ID?** A:通过`SELECT LAST_INSERT_ID()`可精准获取当前连接最后生成的ID[^4] **Q:导入历史数据时如何保持原ID?** A:临时关闭自特性: ```sql SET @@session.auto_increment_increment = 0; -- 插入完成后恢复原设置 ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值