Postgres中的主键分配

时间:2015-07-31 23:12:04

标签: sql postgresql primary-key sql-insert

我在postgres数据库中有表tmp,其中包含大约1.39亿条记录。我正在尝试将列col1col2col3移至另一个名为{的表格的col1col2col3 {1}}。我使用此查询创建了表r4a

r4a

我在查询中创建了此插入,以填充CREATE TABLE r4a( gid serial NOT NULL, col1 double precision, col2 double precision, col3 double precision, the_geom geometry, CONSTRAINT r4a_pkey PRIMARY KEY (gid)); 中的字段:

r4a

它使用[14816024-14816523]的数字填充INSERT INTO r4a (col1,col2,col3) SELECT col1, col2, col3 FROM tmp limit 500; 列。

如何确定限制查询的500条记录呢? 是选择导入行[14816024-14816523]还是只是随意分配数字?

理想情况下,我希望主键从1开始并向上计数。作为postgres的新手并拥有如此大的(在我看来)表格,我想确保我理解发生了什么。

1 个答案:

答案 0 :(得分:1)

为Serial列选择的值与从另一个表中选择的值无关 - 尽管没有ORDER BY子句,这些将是一个完全随意的样本,它很容易检索。

Serial列实际上是一个Integer列,其中定义了一个默认值,该值从一个名为Sequence的特殊对象中获取下一个值。 Sequence是一个与事务无关的计数器,从1开始,并且永远不会重绕,即使读取并丢弃了一个值。

因此,如果您的序列值很高,那么因为您已经请求它的许多值 - 可能是您以后删除的插入,您回滚的事务或中止的语句中途出错。

您可以使用setval()功能手动重置序列;一个有用的方法是setval(pg_get_serial_sequence('r4a', 'gid'), 1)但是请记住,这并不关心已经在表格中插入了什么值,因此如果它生成了已经存在的ID,您将会遇到重复的密钥错误那里(重复插入将继续递增序列并最终生成尚未使用的ID,但这不是您希望生产代码依赖的东西!)。