前提:我现在有三种数据库 分别是 oracle、mysql、pg
场景:现在使用mybatis操作表,执行insert语句,但是我需要返回当前这次插入的主键,其中mysql的主键已被设置为自增,oracel和pg是通过序列查询的
问题:在执行插入的时候,使用selectkey获取本次插入的主键,但是oracle和pg是通过对应的序列查询的,所以selectkey的order 要被设置为 before 。mysql是通过 LAST_INSERT_ID()这个函数,它的order只能被设置为 after
失败方法
1、selectkey和useGeneratedKeys=“” keyProperty=“” 配合使用,这种只有在特定的mysql版本下才可以
2、在insert和selectkey标签上设置对应的database,这种在项目启时数据源就被定死了,不能实现切换,然后就是selectkey标签不能方进任何的判断标签。
解决方案:
方法一:
不使用selectkey只使用mybatis的
useGeneratedKeys="true" keyProperty="主键" keyColumn="主键"
在oracle上对应的表的主键上创建对应的触发器,mysql主键设置成自增,pg上再主键上创建对应的序列,主键绑定这个序列,这样pg也就实现了主键自增,这样就不需要考虑是在之前还是之后 插入了,他都可以返回插入的bsm
方法二:
使用selectkey,因为selectkey只能在插入之前或之后进行查询,但是我们pg和oracle都是查询序列进行插入的,所以只能在之前,那么我们可以在mysql创建一个类似LAST_INSTER_ID()的函数,这样就可以完美解决。但是这种存在弊端,不适用多线程的插入。
关于这个函数的创建sql如下 就是通过mysql的系统表 information_schema 来查询某个库下具体表的自增id的情况,参数第一个是库名 第二个是 表名.
注意:使用这种mysql的主键必须自增,不自增不行。
CREATE DEFINER=`root`@`%` FUNCTION `LAST_INSERT_NEW_ID`(param1 VARCHAR(50), param VARCHAR(50)) RETURNS int(11)
READS SQL DATA
DETERMINISTIC
BEGIN
DECLARE value INTEGER;
SET value = 0;
SELECT AUTO_INCREMENT INTO value
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = param1
AND TABLE_NAME = param;
RETURN value;
END
持续更新中…