Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Golang pq sql驱动程序:批量导入后获取记录ID_Sql_Postgresql_Go - Fatal编程技术网

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

Golang pq sql驱动程序:批量导入后获取记录ID,sql,postgresql,go,Sql,Postgresql,Go,使用用于golang的pq sql驱动程序,我正在执行所述的批量导入。有没有办法获取已创建记录的ID 我假设您在COPY语句中引用的id列基于此类型语句创建的串行生成序列: CREATE SEQUENCE my_serial_name; 这意味着您可以像这样查询id的当前值: SELECT currval('my_serial_name'); 它将返回id计数器的当前值 在回答有关此方法的任何进一步疑问时: 此语句是线程的本地语句,并且完全隔离 上述语句证明此方法在多用户环境中非常有用,并

使用用于golang的pq sql驱动程序,我正在执行所述的批量导入。有没有办法获取已创建记录的ID

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

CREATE SEQUENCE my_serial_name;
这意味着您可以像这样查询id的当前值:

SELECT currval('my_serial_name');
它将返回id计数器的当前值

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

  • 此语句是线程的本地语句,并且完全隔离
  • 上述语句证明此方法在多用户环境中非常有用,并且将生成正确的值,而不会被使用此序列对表执行的其他insert查询所修改
如需进一步阅读,请参考URL,说明:

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

因为nextval和setval调用永远不会回滚,所以 如果序列号的“无间隙”赋值是无效的,则不能使用对象 需要。可以通过使用“独占”创建无间隙分配 锁定包含计数器的桌子;但这一解决方案非常重要 比序列对象更昂贵,尤其是在许多事务 同时需要序列号

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

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


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

底层PostgreSQL
COPY
命令没有提供为生成的列返回结果集的方法。因此,没有,除了查询表以匹配插入的数据并查找任何生成的键之外。@CraigRinger是的,但从Postgres的角度看是可能的(使用
插入到…返回id
),我认为应该有一种方法通过
pq
包实现这一点。是的,有。。。使用
插入到。。。返回
,可能带有多条目的
列表。
COPY
没有等价物,这是您的
pq
包的批量加载方法的文档所建议的。我猜您必须为
pq
编写另一个批量加载变量函数,该函数使用批处理
插入到。。。值(…),(…),(…)。。。返回…
查询。或执行
复制。。。正在返回…
:p