【问题标题】:Golang pq sql driver: get record ids after bulk importGolang pq sql驱动:批量导入后获取记录ID
【发布时间】: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

标签: sql postgresql go


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2016-11-26
    • 2018-11-06
    相关资源
    最近更新 更多