Golang pq sql驱动:批量导入后获取记录ID

Posted

技术标签:

【中文标题】Golang pq sql驱动:批量导入后获取记录ID【英文标题】:Golang pq sql driver: get record ids after bulk import 【发布时间】:2015-03-06 07:32:11 【问题描述】:

使用 golang 的 pq sql 驱动程序,我正在按照in the pq docs 的描述进行批量导入。有没有办法获取创建记录的 ID?

【问题讨论】:

底层 PostgreSQL COPY 命令不提供为生成的列返回结果集的方法。所以不,没有,除了查询表以匹配插入的数据并查找任何生成的键。 @CraigRinger 是的,但是从 Postgres 的角度来看是可能的(使用 INSERT INTO ... RETURNING id),我认为应该有一种方法可以通过 pq 包实现这一点。 是的,有...使用INSERT INTO ... RETURNING,可能带有多条目VALUES 列表。 COPY 没有等效项,这是 pq 包的批量加载方法的文档建议它使用的。我猜你必须为pq 编写另一个批量加载变体函数,它使用批处理INSERT INTO ... VALUES (...), (...), (...), ... RETURNING ... 查询来代替。或者实现COPY ... RETURNING ...:p 【参考方案1】:

我假设您在 COPY 语句中引用的 id 列是基于此类语句创建的串行生成序列:

CREATE SEQUENCE my_serial_name;

这意味着你可以像这样查询id的当前值:

SELECT currval('my_serial_name');

这将返回 id 计数器的当前值。

回答有关此方法的任何进一步疑问:

此语句是线程本地且完全隔离的, 上面的陈述证明了这个方法在多用户环境中很有用,并且会产生正确的值,不会被其他插入查询修改使用这个序列在表上执行

如需进一步阅读,请参阅以下网址:

表9-42中列出的序列函数(包括currval), 提供简单的、多用户安全的方法来获得连续的 来自序列对象的序列值。

https://www.postgresql.org/docs/9.3/static/functions-sequence.html

因为 nextval 和 setval 调用永远不会回滚,所以序列 如果序列号的“无缝”分配是,则不能使用对象 需要。可以通过使用独占来构建无间隙分配 锁定包含计数器的表;但是这个解决方案很多 比序列对象更昂贵,特别是如果有很多事务 同时需要序列号。

https://www.postgresql.org/docs/9.5/static/sql-createsequence.html

要设置事务的事务隔离级别,请使用 命令 SET TRANSACTION。

重要提示:某些 PostgreSQL 数据类型和函数有特殊规则 关于交易行为。特别是,对一个 序列(因此使用串行声明的列的计数器) 对所有其他事务立即可见并且不滚动 如果进行更改的事务中止,则返回。见第 9.16 节 和第 8.1.4 节。

https://www.postgresql.org/docs/9.5/static/transaction-iso.html

我希望这能回答您的问题。 Postgresql 是一个很棒的数据库,如果掌握了细节,它可以成为一个非常强大的工具。祝你好运! :D

【讨论】:

以上是关于Golang pq sql驱动:批量导入后获取记录ID的主要内容,如果未能解决你的问题,请参考以下文章

Golang使用准备好的SQL语句

Golang慢扫描()多行

golang 根据keys获取的key列表批量删除

从另一个包和文件 golang 导入结构

golang xorm reverse 自动生成数据库实体文件

JAVA项目中批量导入数据到数据库后,数据库出问题