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的那行记录的自增字段值.带参数时会将自己存储的数字刷成参数给定的值 ...
随机推荐
- 探秘SuperCLUE-Safety:为中文大模型打造的多轮对抗安全新框架
探秘SuperCLUE-Safety:为中文大模型打造的多轮对抗安全新框架 进入2023年以来,ChatGPT的成功带动了国内大模型的快速发展,从通用大模型.垂直领域大模型到Agent智能体等多领域的 ...
- junit使用mock objects进行单元测试
上一篇我介绍了使用stub进行单元测试.那么mock objects和stub有何区别?什么情况下使用mock objects呢? 下面摘自junit in action书中的解释: mock obj ...
- Java开发技巧杂记
杂记一 创建项目的spring initializr,要求是创建spring boot3.0,且不在支持java8语言,且要求语言大于17,所以创建项目时,无法创建srping2.0项目了:如果要创建 ...
- 获取Linux mac地址(centos与ubuntu通用)
ip -a addr| grep link/ether | awk '{print $2}'| head -n 1 获取Linux mac地址(centos与ubuntu通用)
- redis7源码分析:redis 多线程模型解析
多线程模式中,在main函数中会执行InitServerLast void InitServerLast() { bioInit(); // 关键一步, 这里启动了多条线程,用于执行命令,redis起 ...
- 类型判断,代码块,流程控制及循环---day05
1.类型判断isinstance 用来做判断类型 语法: 用法一: isinstance(要判断的值,要判断的类型) 返回的是真或者假 用法二: isinstance(要判断的值,(可能的类型))如果 ...
- .NET Core 引发的异常:“sqlsugar.sqlsugarexception” 位于 system.private.corelib.dll 中
运行一个.NET Core 项目 报错:引发的异常:"sqlsugar.sqlsugarexception" 位于 system.private.corelib.dll 中 . 我 ...
- 【LeetCode递归】括号生成,使用dfs
括号匹配 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合. 示例 1: 输入:n = 3 输出:["((()))","(() ...
- 【Azure 应用服务】Azure Function 不能被触发
问题描述 Azure Function 不能被Postman 触发,错误信息如下: Error: write EPROTO 4020778632:error:100000f7:SSL routines ...
- 【Azure 应用服务】"App Service"如何能判断自身网路没有问题?
问题描述 当创建了一个App Service服务后,如何能判断服务自身网络链路路没有问题? 如果是用VM,通常用Ping可以判断.但是"网站应用App Service" 的Kudu ...