我在下面的CREATE STATEMENT和Mapper文件中得到了重复的ID。我使用的数据库是DB2。有人能帮忙吗?非常感谢!
[创建表格]
建立表格供应_BCP_交易_流程(ID整数非空值由默认值生成为标识,序列号无变量字符(40),BAT无变量字符(32),付款人_ACC_无变量字符(40),付款人帐户名称VARCHAR(255),收款人_自记_无变量字符(40),受款人帐户名称变量字符(255),受款人交易方标识VARCHAR(20),传输_数量小数(16,2),费用金额小数(16,2),后脚本变量字符(300),备忘录变量字符(255),返回类型变量字符(1),返回_代码变量字符(8),返回消息变量字符(255),旧返回代码变量字符(32),旧返回消息变量字符(255),字符串1变量字符(1024),字符串2变量字符(1024),字符串3变量字符(1024),字符串4变量字符(1024),字符串5变量字符(1024),序列号变量字符(20),其他_序列_无变量字符(40)、通知_状态变量字符(1)、创建_时间时间戳默认当前时间戳、更新_时间时间戳默认当前时间戳、通知_时间整数);
[Map器文件]
https://i.stack.imgur.com/MmaTa.png
插入到SUP_BCP_TRANS_FLOW中(BAT_NO、序列号、付款人ACC_NO、受款人ACC_NO、受款人ACC_NAME、受款人交易方标识、转帐金额、费用金额、过帐脚本、备忘录、返回类型、返回代码、返回消息、旧返回代码、旧返回消息、结构1、结构2、结构3、结构4、结构5、序列号、其他序列号、通知状态、通知时间)值(#{项目批处理编号,数据库类型=VARCHAR},#{项目序列号,数据库类型=VARCHAR},#{项目付款人帐号,数据库类型= VARCHAR},#{项目收款人帐号,数据库类型= VARCHAR},#{项目收款人帐号,数据库类型=VARCHAR},#{项目收款人帐号,数据库类型=VARCHAR},#{项目收款人交易方标识,{项目.交易金额,数据库类型=VARCHAR},#{项目.费用金额,数据库类型= DECIMAL},#{项目.附言,数据库类型=VARCHAR},#{项目.备忘录,数据库类型= VARCHAR},#{项目.返回类型,数据库类型= VARCHAR},#{项目.返回代码,数据库类型= VARCHAR},#{项目.返回消息,数据库类型= VARCHAR},#{项目.旧返回代码,数据库类型= VARCHAR},#{项目.旧返回消息,数据库类型= VARCHAR},#{项目.结构1,{项目序号,数据库类型= VARCHAR},{项目其他序号,数据库类型= VARCHAR},{项目通知状态,数据库类型= VARCHAR},{项目通知时间,数据库类型=INTEGER})
1条答案
按热度按时间waxmsbnn1#
这与Mybatis无关-相反,这是由表设计引起的。
您观察到的是
GENERATED BY DEFAULT...
子句的预期行为。但是你似乎期望这个行为应该与
GENERATED ALWAYS AS IDENTITY...
子句沿着PRIMARY KEY(id)
子句相对应,这两个子句的组合将保证唯一性。但是,如果只指定
GENERATED BY DEFAULT...
子句,而不指定唯一索引或主键约束,则不能保证该列的唯一性。GENERATED BY DEFAULT
表示Db2仅在应用程序不提供值时生成唯一值。但是,如果任何应用程序选择提供值,则Db2将使用该值(且不会产生新值),并且应用程序提供的值不需要是唯一的**,除非**您的DDL还指定了PRIMARY KEY(id)
子句。请记住,可能有多个应用程序(或人员)能够向表中插入行。如果要确保名为'id'的列中的行在'id'列中具有唯一值,则必须安排表具有唯一索引。在创建表时实现此目的的最简单方法是在
CREATE TABLE...
语句中指定PRIMARY KEY(id)
。您也可以在以后使用create unique index
语句单独创建唯一索引。或者使用alter table ... add constraint...
子句指定主键,尽管您必须事先通过调整删除任何重复值。