Mybatis 怎么会产生重复的 Id?还是我不该怪?

How can Mybatis generates duplicate Id?Or I should not blame it?

我通过以下 CREATE STATEMENT 和 Mapper 文件得到了重复的 ID。我使用的数据库是 DB2。有人能帮忙吗?非常感谢!

[创建 TABLE]

CREATE TABLE SUP_BCP_TRANS_FLOW (ID INTEGER NOT NULL 默认生成为 IDENTITY, SERIAL_NO VARCHAR(40), BAT_NO VARCHAR(32), PAYER_ACC_NO VARCHAR(40), PAYER_ACC_NAME VARCHAR(255), PAYEE_ACC_NO VARCHAR(40), PAYEE_ACC_NAME VARCHAR(255), PAYEE_PARTY_ID VARCHAR(20), TRAN_AMT DECIMAL(16,2), FEE_AMOUNT DECIMAL(16,2), POSTSCRIPT VARCHAR(300), MEMO VARCHAR(255), RET_TYPE VARCHAR( 1), RET_CODE VARCHAR(8), RET_MSG VARCHAR(255), OLD_RET_CODE VARCHAR(32), OLD_RET_MSG VARCHAR(255), STR1 VARCHAR(1024) , STR2 VARCHAR(1024), STR3 VARCHAR(1024), STR4 VARCHAR(1024), STR5 VARCHAR(1024), SER_NO VARCHAR(20), OTH_SERIAL_NO VARCHAR(40), NOTICE_STATUS VARCHAR(1),CREATE_TIME 时间戳默认当前时间戳,UPDATE_TIME 时间戳默认当前时间戳,NOTICE_TIME 整数);

[映射器文件]

https://i.stack.imgur.com/MmaTa.png

插入 SUP_BCP_TRANS_FLOW (BAT_NO,SERIAL_NO,PAYER_ACC_NO,PAYEE_ACC_NO,PAYEE_ACC_NAME,PAYEE_PARTY_ID,TRAN_AMT, FEE_AMOUNT,POSTSCRIPT,MEMO,RET_TYPE,RET_CODE,RET_MSG,OLD_RET_CODE,OLD_RET_MSG,STR1,STR2,STR3,STR4, STR5,SER_NO,OTH_SERIAL_NO,NOTICE_STATUS,NOTICE_TIME) 值 ( #{item.batNo,jdbcType=VARCHAR}, #{item.serialNo,jdbcType=VARCHAR}, #{item.payerAccNo,jdbcType=VARCHAR}, #{item.payeeAccNo,jdbcType=VARCHAR}, #{item.payeeAccName,jdbcType=VARCHAR}, #{item.payeePartyId,jdbcType=VARCHAR}, #{item.tranAmt,jdbcType=DECIMAL}, #{item.feeAmount,jdbcType=DECIMAL}, #{item.postscript,jdbcType=VARCHAR}, #{item.memo,jdbcType=VARCHAR}, #{item.retType,jdbcType=VARCHAR}, #{item.retCode,jdbcType=VARCHAR}, #{item.retMsg,jdbcType=VARCHAR}, #{item.oldRetCode,jdbcType=VARCHAR}, #{item.oldRetMsg,jdbcType=VARCHAR}, #{item.str1,jdbcType=VARCHAR}, #{item.str2,jdbcType=VARCHAR}, #{item.str3,jdbcType=VARCHAR}, #{item.str4,jdbcType=VARCHAR}, #{item.str5,jdbcType=VARCHAR}, #{item.serNo,jdbcType=VARCHAR}, #{item.othSerialNo,jdbcType=VARCHAR}, #{item.noticeStatus,jdbcType=VARCHAR}, #{item.noticeTime,jdbcType=INTEGER} )

这与 Mybatis 无关,而是 table 设计造成的。

您观察到的是 GENERATED BY DEFAULT... 子句的预期行为。

但您似乎期望该行为应与 GENERATED ALWAYS AS IDENTITY... 子句以及 PRIMARY KEY(id) 子句相对应。这两个子句的组合将保证唯一性。

但仅指定 GENERATED BY DEFAULT... 子句,没有唯一索引或主键约束将不能保证该列的唯一性。

GENERATED BY DEFAULT 表示当应用程序不提供值时,Db2 将生成唯一值。但是,如果任何应用程序选择提供一个值,那么 Db2 将改为使用该值(并且不会生成新值),并且该应用程序提供的值不需要是唯一的 除非 您的DDL 还指定了 PRIMARY KEY(id) 子句。请记住,不止一个应用程序(或人)可能能够将行插入 table.

如果要确保名为 'id' 的列在 'id' 列中包含具有唯一值的行,那么您必须安排 table 具有唯一索引。在创建 table 时最简单的方法是在 CREATE TABLE... 语句中指定 PRIMARY KEY(id)。您也可以在之后单独创建唯一索引,使用 create unique index 语句,或使用 alter table ... add constraint... 子句指定主键,但您必须先通过预先调整删除任何重复值。