用户从mysql迁移到金仓数据库过程中,应用中使用了mysql函数last_insert_id()来获取最近insert的那行记录的自增字段值。

mysql文档中关于函数的说明和例子:

LAST_INSERT_ID()

如果没有参数,则LAST_INSERT_ID()返回一个BIGINT UNSIGNED(64位)值,表示AUTO_INCREMENT由于最近执行的INSERT语句而成功为列添加的第一个自动生成的值。LAST_INSERT_ID()如果没有成功插入行,则值保持不变(如果连接尚未成功INSERT,则返回0 )。

mysql> CREATE TABLE t (
id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
name VARCHAR(10) NOT NULL
); mysql> INSERT INTO t VALUES (NULL, 'Bob'); mysql> SELECT * FROM t;
+----+------+
| id | name |
+----+------+
| 1 | Bob |
+----+------+ mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 1 |
+------------------+ mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 1 |
+------------------+ mysql> INSERT INTO t VALUES
(NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa'); mysql> SELECT * FROM t;
+----+------+
| id | name |
+----+------+
| 1 | Bob |
| 2 | Mary |
| 3 | Jane |
| 4 | Lisa |
+----+------+ mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 2 |
+------------------+

KingbaseES中序列相关的函数有以下几个:

函数名称 说明
currval(regclass) 返回最近一次用nextval获取的指定序列的值
nextval(regclass) 递增序列并返回新值
setval(regclass,bigint)
setval(regclass,bigint,boolean)
设置序列的当前值
lastval() 返回最近一次用nextval获取的任何序列的值
[kbc7@singlekbdb zip]$ ksql -Usystem -d test -p 7788
ksql (V8.0)
输入 "help" 来获取帮助信息. test=# select lastval;
错误: 在这个会话中还没有定义lastval test=# create table t(id serial,name varchar);
CREATE TABLE
test=# insert into t(name) values ('a');
INSERT 0 1
test=# select lastval;
lastval
---------
1
(1 行记录) test=# insert into t(name) values ('b'),('c'),('d');
INSERT 0 3
test=# select * from t;
id | name
----+------
1 | a
2 | b
3 | c
4 | d
(4 行记录) test=# select lastval;
lastval
---------
4
(1 行记录)

从函数功能看lastval结果最接近LAST_INSERT_ID,但是存在一些差别。

1.新会话连接直接调用lastval函数,会返回一个错误。错误: 在这个会话中还没有定义lastval。mysql 返回 0 。

2.KingbaseES会话中一次插入多条数据,lastval返回的是最后一条数据的值,mysql返回的是第一条数据的值(见上面例子)。 从结果看KingbaseES的返回值更符合实际情况。

在KingbaseES中自定义函数LAST_INSERT_ID函数时考虑通过异常捕获来实现初始连接返回0。

CREATE OR REPLACE FUNCTION last_insert_id() RETURNS bigint AS $$
begin
return pg_catalog.lastval();
exception when others then
return 0;
end
$$ LANGUAGE plpgsql; CREATE FUNCTION
test=# select last_insert_id;
last_insert_id
----------------
0
(1 行记录)

KingbaseES 实现 MySQL 函数 last_insert_id的更多相关文章

  1. Mysql函数:Last_insert_id()语法讲解

    Mysql函数可以实现许多我们需要的功能,下面介绍的Mysql函数Last_insert_id()就是其中之一,希望对您学习Mysql函数能有所帮助. 自动返回最后一个INSERT或 UPDATE 查 ...

  2. mysql函数之六:mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey

    mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...

  3. mysql select last_insert_id()函数返回的值

    mysql)); 创建表j 插入数据 mysql> insert into j(name) values('wanggiqpg'); Query OK, row affected (0.00 s ...

  4. Mysql - 函数

    Mysql提供的函数是在是太多了, 很多我都见过, 别说用了. 园子里面, 有人弄了一个比较全的. MYSQL函数 我这里会将他写的完全拷贝下来, 中间会插入一些自己项目中使用过的心得 一.数学函数 ...

  5. mysql函数大全

    对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL,返回NULL. mysql& ...

  6. MySQL 函数大全

    mysql函数大全 对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL,返回NU ...

  7. mysql函数全解析

    本文摘自:http://www.cnblogs.com/cocos/archive/2011/05/06/2039469.html mysql函数大全 对于针对字符串位置的操作,第一个位置被标记为1. ...

  8. 【转】mysql函数

    MySQL函数 MySQL数据库提供了很多函数包括: 数学函数: 字符串函数: 日期和时间函数: 条件判断函数: 系统信息函数: 加密函数: 格式化函数: 一.数学函数 数学函数主要用于处理数字,包括 ...

  9. 第五章 MySQL函数

    一.数学函数 (1) 绝对值函数:ABS(x) ABS(x) 用于返回 x 的绝对值 mysql> SELECT ABS(2), ABS(-2.3), ABS(-33); +--------+- ...

  10. mysql利用LAST_INSERT_ID实现id生成器

    首先了解 LAST_INSERT_ID LAST_INSERT_ID 有自己的存储空间,能存一个数字 不带参数时返回最近insert的那行记录的自增字段值.带参数时会将自己存储的数字刷成参数给定的值 ...

随机推荐

  1. 【Android】使用Binder实现进程间传递对象案例

    1 前言 使用AIDL实现进程间通讯简单案例 和 使用AIDL实现进程间传递对象案例 中介绍了使用 AIDL 进行进程间通讯,其本质仍然是Binder,aidl 文件对应生成的接口中,将服务端调用的抽 ...

  2. 关于php redis的geocoding函数

    在php的redis扩展官方github上,文档的最下面的确存在geocoding的函数说明.但是笔者尝试调用geoAdd函数时,返回值一直为false.就纳闷了,是使用的姿势不对,还是存在其它问题? ...

  3. 文件IO操作开发笔记(二):使用Cpp的ofstream对磁盘文件存储进行性能测试以及测试工具

    前言   在做到个别项目对日志要求较高,要求并行写入的数据较多,尽管写入数据的线程放在子线程,仍然会造成界面程序的假死(实际上Qt还是在跑,只是磁盘消耗超过瓶颈,造成假死(注意:控制台还能看到打印输出 ...

  4. Elasticsearch下载安装配置

    下载地址 # elasticsearch https://www.elastic.co/cn/downloads/past-releases/elasticsearch-6-8-3 # kibana ...

  5. Go语言实现记账本

    使用面向过程思想实现 package main import ( "fmt" ) func main(){ key := "" //设置初始金额 sum := ...

  6. 【LeetCode动态规划#16】矩阵的最小路径和、三角形的最小路径和

    矩阵的最小路径和 给定一个包含非负整数的 *m* x *n* 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:一个机器人每次只能向下或者向右移动一步. 示例 1 ...

  7. 【LeetCode贪心#05】K 次取反后最大化的数组和(自定义sort、二重贪心)

    K次取反后最大化的数组和 力扣题目链接(opens new window) 给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这 ...

  8. 第124篇: 期约Promise基本方法

    好家伙,本篇为<JS高级程序设计>第十章"期约与异步函数"学习笔记   1.异步编程 同步行为和异步行为的对立统一是计算机科学的一个基本概念. 特别是在 JavaScr ...

  9. ClickHouse学习笔记--ClickHouse的整体特性

    本文主要包含如下内容: ClickHouse适用场景 ClickHouse缺点 ClickHouse优点 ClickHouse表引擎-合并树 ClickHouse表引擎-合并树-稀疏索引 ClickH ...

  10. MySQL8.0与5.7版本的下载、安装与配置

    •软件下载 下载地址 [官网],点开该网址,点击  DOWNLOAD 来到如下页面: MySQL的版本介绍 MySQL Community Server  社区版本:开源免费,自由下载,但不提供官方技 ...