首页 > 数据库 >KingbaseES 实现 MySQL 函数 last_insert_id

KingbaseES 实现 MySQL 函数 last_insert_id

时间:2023-05-09 19:46:19浏览次数:34  
标签:insert lastval last INSERT MySQL ID mysql LAST 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 行记录)

标签:insert,lastval,last,INSERT,MySQL,ID,mysql,LAST,id
From: https://www.cnblogs.com/kingbase/p/17370383.html

相关文章

  • MySQL实现树形查询
    需要mysql8以上,5.7不支持  https://www.jianshu.com/p/f908aa35d448  CREATETABLE`perm_resource`(`resource_id`varchar(50)NOTNULLCOMMENT'资源ID',`resource_name`varchar(100)DEFAULTNULLCOMMENT'资源名称',`resource_parent_id`var......
  • 使用java restclient连接elasticsearch
    java连接es方式有transport、restclient、javaclient方式。官方最新标的transport和restclient方式都已经过时了,这里用的es7还是以restclient方式进行连接测试。javaclient是es7.15之后推出的。下面开始使用HighLevelJavaRESTClient。maven依赖org.elasticsearch.cl......
  • mysql 去重分组后取每组时间最新的一条记录
    mysql去重分组后取每组时间最新的一条记录第一步:先分组后取到分组的那个id以及每个组最新的数据--先根据课程分组,然后在取这组统计数据中最先的日期selectCourseID,MAX(CountDate)asCountDate fromRep_school_class_course_count_data_cod......
  • MySQL笔记之文件和日志
    一、存储文件1、存放位置MySQL数据库会在data目录下,以数据库为名,为每一个数据库建立文件夹,用来存储数据库中的表文件数据。不同的数据库引擎,每个表的扩展名也不一样,例如:MyISAM用“.MYD”作为扩展名,Innodb用“.ibd”等。 2、FRM表结构信息文件无论是哪种存储引擎,创建表之......
  • php:7-cli-apline安装mysql redis mongo扩展模块
    apkadd--no-cachebuild-dependenciesbuild-baseopenssl-devautoconfg++libtoolmakecurl-devlibxml2-devlinux-headersdocker-php-ext-install-j2mysqlidocker-php-ext-installpdo_mysqlpeclinstallmongodb-1.2.2echo"extension=mongodb.so"......
  • 由浅入深学MySQL之事务全攻略
    前言从今天开始本系列就带各位小伙伴学习数据库技术。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深,全面讲解数据库体系。非常适合零基础的小伙伴来学习。全文大约【1707】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!......
  • SQLite3 to MySQL
    SQLite3toMySQLAsimplePythontooltotransferdatafromSQLite3toMySQL.Ioriginallywrotethissimpleprogramasastandalonescriptandpublisheditasa gist asananswertothis StackOverflowquestion.Sincethenquitesomepeoplehavetakeni......
  • MySQL的redolog和binlog有哪些区别?
    redolog是innodb生成的日志,主要为了保证数据的可靠性;binlog是MySQLserver层面上生成的日志,主要用于pointintime恢复和主从复制。undolog主要用于事务的回滚和一致性快照读(MVCC多版本并发控制)。MySQL中的redolog、binlog的功能很像,那么有什么区别?区别如下:red......
  • using method 'mysql_native_password' failed with message
    错误消息:Connectionopenerror.Authenticationtohost'10.114.129.206'foruser'root'usingmethod'mysql_native_password'failedwithmessage:Readingfromthestreamhasfailed.DbType="MySql";ConfigId=""......
  • MySQL百万数据深度分页优化思路分析
    业务场景一般在项目开发中会有很多的统计数据需要进行上报分析,一般在分析过后会在后台展示出来给运营和产品进行分页查看,最常见的一种就是根据日期进行筛选。这种统计数据随着时间的推移数据量会慢慢的变大,达到百万、千万条数据只是时间问题。瓶颈再现创建了一张user表,给create......