mybits对达梦数据插入数据时,自增列返回的值不对

文章讲述了作者在将pg库数据迁移到梦数据库时遇到的问题,用户新增时自增ID导致关联用户角色失败。解决方法是通过查询唯一的用户名来确保数据一致性。

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

今天在做pg库转达梦数据库时,程序运行,发现一个问题。对用户进行新增时,发现用户角色没有同时添加成功。经过代码排查,发现在对用户进行新增时,用户的id是自增的。插入user表后,user对象的userid和数据库的值不对。导致后续插入用户角色表的时候,关联错误。网上找了下资料,也没找到好的解决办法。我这边的解决办法是,通过用户名再去数据库查询一次,因为用户名也是惟一的。

<think>好的,用户想知道在达梦数据库中如何实现主键自。我需要先回忆一下达梦数据库的相关知识,并结合提供的引用内容来整理回答。 首先,达梦数据库的自主键实现方法可能有几种。根据引用[4]提到的,传统方式是使用序列和触发器。这应该是一个方法。步骤应该是先创建序列,然后创建触发器,在插入数据触发,为主键字段赋序列的下一个。引用[3]也提到自增列的实现,可能还有其他方式,比如IDENTITY关键字? 然后,引用[2]和[3]可能提到了使用MyBatis-Plus的配置。比如在实体类中使用注解设置自,或者在插入后执行SQL获取自ID。这可能涉及到应用层的配置,而不仅仅是数据库的设置。引用[1]提到MySQL使用useGeneratedKeys,但达梦可能需要不同的处理,比如插入后获取序列的当前。 另外,引用[3]和[4]都提到了达梦可能有类似IDENTITY列的方式,类似于其他数据库的自增列。例如在创建表指定字段为IDENTITY(1,1),这样插入自动生成。这可能是一种更简便的方式,不需要显式使用序列和触发器。 需要注意用户的问题可能涉及两种场景:直接在数据库层面设置自主键,以及在应用程序中如何获取自后的,比如使用MyBatis-Plus的情况。需要分步骤说明这两种情况。 所以,总结可能的实现方法: 1. 使用IDENTITY属性:在创建表定义字段为IDENTITY类型,自动递。这种方式简单,无需额外对象。例如: CREATE TABLE table (id INT IDENTITY(1,1), ...); 这样插入不需要指定id的数据库会自动填充。 2. 使用序列+触发器:传统方式,适用于需要更灵活控制的场景。创建序列,然后创建触发器在插入前将序列赋给主键字段。 3. 在MyBatis-Plus中的处理:可能需要配置实体类的注解,如@KeySequence和@TableId,插入后执行查询获取序列当前,如引用[2]和[5]提到的,添加SQL语句如SELECT "序列名".CURRVAL来获取刚插入的ID。 需要对比这些方法的步骤,并给出示例。同提醒注意事项,如IDENTITY列的限制(例如每个表只能有一个IDENTITY列),以及不同方法的适用场景。 可能的问题点:用户是否了解达梦的IDENTITY特性?或者是否习惯使用序列?需要明确说明两种方法的优缺点,以及如何选择。 然后根据引用内容,引用[4]和[3]提到序列+触发器,而引用[3]可能还提到了IDENTITY方式。需要正确引用这些资料来支持回答。 最后,生成相关问题,例如如何迁移其他数据库的自增列达梦,或者如何处理批量插入的自主键返回等。</think>### 达梦数据库主键自的实现方法 达梦数据库实现主键自主要有以下两种方式,根据使用场景选择合适的方法: --- #### **方法一:使用IDENTITY属性(推荐)** 在创建表直接为字段添加`IDENTITY`属性,类似于其他数据库的自增列功能[^3][^4]。 ```sql CREATE TABLE user ( id INT PRIMARY KEY IDENTITY(1,1), -- 起始1,步长1 name VARCHAR(50) ); ``` **特点:** - 插入数据无需指定`id`字段,数据库自动生成递整数。 - 每个表只能有一个`IDENTITY`列[^3]。 - 兼容性高,适合从其他数据库迁移简化操作。 --- #### **方法二:使用序列+触发器** 通过手动创建**序列**和**触发器**实现自逻辑,适用于需要灵活控制序列规则的场景[^4]。 1. **创建序列**: ```sql CREATE SEQUENCE user_id_seq START WITH 1 INCREMENT BY 1 NOCACHE; ``` 2. **创建触发器**: ```sql CREATE TRIGGER user_id_trigger BEFORE INSERT ON user FOR EACH ROW BEGIN SELECT user_id_seq.NEXTVAL INTO :NEW.id FROM DUAL; END; ``` **特点:** - 可自定义序列起始、步长和缓存策略。 - 适合需要跨表共享序列的场景。 --- #### **应用层获取自(如MyBatis-Plus)** 若需在代码中获取插入后的自主键,可参考以下配置[^2][^5]: 1. **实体类注解**: ```java @TableName("user") public class User { @TableId(value = "id", type = IdType.INPUT) @KeySequence("user_id_seq") // 对应达梦序列名 private Integer id; private String name; } ``` 2. **插入后查询序列当前**: ```sql INSERT INTO user(name) VALUES ('test'); SELECT user_id_seq.CURRVAL FROM DUAL; -- 获取刚插入的ID ``` --- #### **注意事项** - 使用`IDENTITY`列,批量插入可能无法直接返回所有自ID,需逐条查询[^1]。 - 达梦的`IDENTITY`属性与MySQL的`AUTO_INCREMENT`类似,但语法和细节有差异。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值