KingbaseES 实现 MySQL 函数 last_insert_id
用户从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的更多相关文章
- Mysql函数:Last_insert_id()语法讲解
Mysql函数可以实现许多我们需要的功能,下面介绍的Mysql函数Last_insert_id()就是其中之一,希望对您学习Mysql函数能有所帮助. 自动返回最后一个INSERT或 UPDATE 查 ...
- mysql函数之六:mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey
mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...
- mysql select last_insert_id()函数返回的值
mysql)); 创建表j 插入数据 mysql> insert into j(name) values('wanggiqpg'); Query OK, row affected (0.00 s ...
- Mysql - 函数
Mysql提供的函数是在是太多了, 很多我都见过, 别说用了. 园子里面, 有人弄了一个比较全的. MYSQL函数 我这里会将他写的完全拷贝下来, 中间会插入一些自己项目中使用过的心得 一.数学函数 ...
- mysql函数大全
对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL,返回NULL. mysql& ...
- MySQL 函数大全
mysql函数大全 对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL,返回NU ...
- mysql函数全解析
本文摘自:http://www.cnblogs.com/cocos/archive/2011/05/06/2039469.html mysql函数大全 对于针对字符串位置的操作,第一个位置被标记为1. ...
- 【转】mysql函数
MySQL函数 MySQL数据库提供了很多函数包括: 数学函数: 字符串函数: 日期和时间函数: 条件判断函数: 系统信息函数: 加密函数: 格式化函数: 一.数学函数 数学函数主要用于处理数字,包括 ...
- 第五章 MySQL函数
一.数学函数 (1) 绝对值函数:ABS(x) ABS(x) 用于返回 x 的绝对值 mysql> SELECT ABS(2), ABS(-2.3), ABS(-33); +--------+- ...
- mysql利用LAST_INSERT_ID实现id生成器
首先了解 LAST_INSERT_ID LAST_INSERT_ID 有自己的存储空间,能存一个数字 不带参数时返回最近insert的那行记录的自增字段值.带参数时会将自己存储的数字刷成参数给定的值 ...
随机推荐
- ex命令
ex命令 ex命令用于在Ex模式下启动vim文本编辑器,ex执行效果如同vi -e,如要从Ex模式回到普通模式,则在vim中输入:vi或:visual指令即可,可以通过运行vi -e来启动ex,也可以 ...
- 从零开始学Spring Boot系列-Hello World
欢迎来到从零开始学Spring Boot的旅程!在这个系列的第二篇文章中,我们将从一个非常基础但重要的示例开始:创建一个简单的Spring Boot应用程序,并输出"Hello World& ...
- 【LeetCode排序专题01】由旋转数组的最小数字引出的关于排序算法的讨论(冒泡排序、二分查找+暴力法)
旋转数组的最小数字 剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一 ...
- Linux 多进程服务配置 systemd
目录 Linux 多进程服务配置 systemd sysvinit和systemd 多进程保活 创建配置文件(设定重试次数) 多进程服务管理 链式启动(服务依赖) 指定关闭进程方式 - ExecSto ...
- Java 线程安全问题 使用同步机制讲单例模式中的懒汉式改写为线程安全的
1 package bytezero.deadlock; 2 3 /** 4 * 使用同步机制讲单例模式中的懒汉式改写为线程安全的 5 * 6 * 7 * 8 * 9 * @author Byteze ...
- Jmeter+Influxdb+Grafana搭建
背景 在无界面压测情况下,我们需要去额外搭建可视化观测平台.借助于Influxdb+Grafana,我们可以轻松让Jmeter的结果自动写入Influxdb,Influxdb实时存储运行结果,最后由G ...
- Java多线程转账
Java多线程转账 关键词:多线程,Java 以前的一道面试题,要求是使用Java多线程,实现一个转账业务.不考虑数据库,不考虑其他第三方系统.只考虑当前Java程序内各个账户进行转账,保证转账金额正 ...
- VSCode 配置 Spring Boot 项目开发环境
神器IDEA在升级到2023之后越发卡顿, EDU邮箱也不能用了, 照现在这个JDK版本的升级速度, 神器不升级也不行, 需要开始物色替代品. 其它IDE我用得少, VSCode还是比较熟悉的, 可以 ...
- Zabbix自动发现:python-json模块应用介绍
一.JSON模块介绍 json模块是python内置的库,其主要功能是将序列化数据从文件里读取出来或者存入文件.该模块有四个方法:dump().load().dumps().loads(),其中dum ...
- Vue3.x知识图谱
Vue3.x知识图谱 https://gitee.com/jishupang/vue3-knowledge-map/tree/master 回头有时间再贴图吧