JAVA开发Erp时日志报错:SQL 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 ‘***‘ 中的标识列插入显式值

错误提示

sql 复制代码
### SQL: INSERT INTO sys_user  ( user_id, username, password,      status,   create_time,  update_time )  VALUES  ( ?, ?, ?,      ?,   ?,  ? )
### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'sys_user' 中的标识列插入显 式值。
; 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'sys_user' 中的标识列插入显式值。; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'sys_user' 中的标识列插入显式值。] with root cause
com.microsoft.sqlserver.jdbc.SQLServerException: 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'sys_user' 中的标识列插入显式值。

从错误信息来看,问题出在尝试向 sys_user 表中插入数据时,显式指定了标识列(通常是自增主键列)的值,而该表的 IDENTITY_INSERT 属性设置为 OFF。在 SQL Server 中,默认情况下,标识列(自增主键列)不允许显式插入值,必须由数据库自动生成。

错误原因

复制代码
com.microsoft.sqlserver.jdbc.SQLServerException: 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 'sys_user' 中的标识列插入显式值。
  • 标识列 : 通常是指带有 IDENTITY 属性的列,例如 user_id
  • IDENTITY_INSERT: 控制是否可以将显式值插入到表的标识列中。
  • 默认行为 : 默认情况下,IDENTITY_INSERTOFF,不允许显式插入标识列的值。

解决步骤

  1. 检查表结构:

    • 确认 sys_user 表中的 user_id 列是否具有 IDENTITY 属性。
  2. 决定解决方案:

    • 方案一 : 移除插入语句中的 user_id 值,让数据库自动生成。
    • 方案二 : 如果确实需要显式插入 user_id 值,临时启用 IDENTITY_INSERT

方案一:移除 user_id

如果你不需要显式指定 user_id 值,可以让数据库自动生成。修改插入语句如下:

sql 复制代码
INSERT INTO sys_user (username, password, status, create_time, update_time)
VALUES (?, ?, ?, ?, ?);
示例代码

假设你使用的是 JDBC 进行数据库操作,以下是示例代码:

java 复制代码
String sql = "INSERT INTO sys_user (username, password, status, create_time, update_time) VALUES (?, ?, ?, ?, ?)";
try (PreparedStatement pstmt = connection.prepareStatement(sql)) {
    pstmt.setString(1, username);
    pstmt.setString(2, password);
    pstmt.setInt(3, status);
    pstmt.setTimestamp(4, new Timestamp(createTime.getTime()));
    pstmt.setTimestamp(5, new Timestamp(updateTime.getTime()));
    pstmt.executeUpdate();
} catch (SQLException e) {
    logger.error("Error inserting user: ", e);
}

方案二:启用 IDENTITY_INSERT

如果你确实需要显式插入 user_id 值,可以临时启用 IDENTITY_INSERT。但请注意,这种方法仅应在必要时使用,并且要注意潜在的风险。

启用 IDENTITY_INSERT
sql 复制代码
SET IDENTITY_INSERT sys_user ON;
插入数据
sql 复制代码
INSERT INTO sys_user (user_id, username, password, status, create_time, update_time)
VALUES (?, ?, ?, ?, ?, ?);
禁用 IDENTITY_INSERT
sql 复制代码
SET IDENTITY_INSERT sys_user OFF;
示例代码

以下是一个完整的示例,展示了如何在 Java 中使用 JDBC 启用和禁用 IDENTITY_INSERT 并插入数据:

java 复制代码
String enableIdentityInsertSql = "SET IDENTITY_INSERT sys_user ON;";
String insertSql = "INSERT INTO sys_user (user_id, username, password, status, create_time, update_time) VALUES (?, ?, ?, ?, ?, ?)";
String disableIdentityInsertSql = "SET IDENTITY_INSERT sys_user OFF;";

try (Statement stmt = connection.createStatement()) {
    // 启用 IDENTITY_INSERT
    stmt.execute(enableIdentityInsertSql);

    try (PreparedStatement pstmt = connection.prepareStatement(insertSql)) {
        pstmt.setLong(1, userId);
        pstmt.setString(2, username);
        pstmt.setString(3, password);
        pstmt.setInt(4, status);
        pstmt.setTimestamp(5, new Timestamp(createTime.getTime()));
        pstmt.setTimestamp(6, new Timestamp(updateTime.getTime()));
        pstmt.executeUpdate();
    }

    // 禁用 IDENTITY_INSERT
    stmt.execute(disableIdentityInsertSql);
} catch (SQLException e) {
    logger.error("Error inserting user with explicit ID: ", e);
}

总结

  • 错误原因 : 尝试向标识列插入显式值,而 IDENTITY_INSERT 设置为 OFF
  • 解决方法 :
    1. 移除 user_id: 让数据库自动生成标识列的值。
    2. 启用 IDENTITY_INSERT : 临时启用 IDENTITY_INSERT 以允许显式插入标识列的值,但在操作完成后记得禁用它。
相关推荐
q***062914 分钟前
LangChain-08 Query SQL DB 通过GPT自动查询SQL
数据库·sql·langchain
一 乐16 分钟前
水果销售|基于springboot + vue水果商城系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端
JIngJaneIL17 分钟前
校园任务平台|校园社区系统|基于java+vue的校园悬赏任务平台系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·校园任务平台
三省同学20 分钟前
SpringBoot 项目LOG_PATH_IS_UNDEFINED问题完整解决方案
java·spring boot·后端
阿蔹20 分钟前
抓包工具Charles——介绍、篡改数据、弱网环境测试
java·自动化·抓包·charles
剪一朵云爱着22 分钟前
PAT 1164 Good in C
c语言·开发语言
i***683226 分钟前
【MyBatis】spring整合mybatis教程(详细易懂)
java·spring·mybatis
小马爱打代码36 分钟前
Spring AI:ChatMemory 实现聊天记忆功能
java·人工智能·spring
LNN202238 分钟前
Qt 5.8.0 下实现触摸屏热插拔功能的探索与实践(3)
开发语言·qt
小许学java41 分钟前
数据结构-模拟实现顺序表和链表
java·数据结构·链表·arraylist·linkedlist·顺序表模拟实现·链表的模拟实现