当前位置: 首页 > news >正文

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

错误提示

### 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 值,可以让数据库自动生成。修改插入语句如下:

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

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

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
SET IDENTITY_INSERT sys_user ON;
插入数据
INSERT INTO sys_user (user_id, username, password, status, create_time, update_time)
VALUES (?, ?, ?, ?, ?, ?);
禁用 IDENTITY_INSERT
SET IDENTITY_INSERT sys_user OFF;
示例代码

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

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_INSERTstmt.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_INSERTstmt.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 以允许显式插入标识列的值,但在操作完成后记得禁用它。
http://www.lryc.cn/news/508631.html

相关文章:

  • [计算机网络]ARP协议的故事:小明找小红的奇妙旅程
  • 数学竞赛网站:构建互动学习的网络平台
  • IntelliJ IDEA 快捷键大全:提升开发效率的利器
  • 机器人角度参考方式
  • VSCode:IDE显示设置 --自定义字体及主题颜色
  • docker run命令大全
  • Debezium日常分享系列之:Debezium 3.0.5.Final发布
  • 机器学习常用评估Metric(ACC、AUC、ROC)
  • uniapp 微信小程序 功能入口
  • typora数学符号
  • 如何保障多个Facebook账号稳定运行:一账号一稳定IP?
  • 今日总结 2024-12-23
  • c++------------------函数
  • 软件信息化平台项目投标技术方案中如何进行项目实施方案以及安全质量方案培训售后方案应急预案的编写?
  • Apache Tomcat 漏洞CVE-2024-50379条件竞争文件上传漏洞 servlet readonly spring boot 修复方式
  • 中国信通院致信感谢易保全:肯定贡献能力,期许未来合作
  • 20241220流水的日报 mysql的between可以用于字符串 sql 所有老日期的,保留最新日期
  • 低代码开源项目Joget的研究——安装部署
  • 《鸿蒙开发-答案之书》字符串占位符格式化
  • workman服务端开发模式-应用开发-gateway长链接端工作原理
  • Android 关于Tencent vConsole 添加入webView 总结
  • 【路径规划】原理及实现
  • 【AIGC】ChatGPT 结构化 Prompt 的高级应用
  • Go web 开发框架 Iris
  • uniapp Native.js 调用安卓arr原生service
  • C#代码实现把中文录音文件(.mp3 .wav)转为文本文字内容
  • 【一文了解】C#重点-委托1
  • WPF+MVVM案例实战与特效(四十五)- 打造优雅交互:ListBox 的高级定制与行为触发(侧边菜单交互面板)
  • 新版Android Studio 2024.1.2版本,如何通过无线wifi连接手机实现交互
  • VTK知识学习(26)- 图像基本操作(一)