我在postgres数据库中有表tmp
,其中包含大约1.39亿条记录。我正在尝试将列col1
,col2
和col3
移至另一个名为{的表格的col1
,col2
和col3
{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的新手并拥有如此大的(在我看来)表格,我想确保我理解发生了什么。
答案 0 :(得分:1)
为Serial列选择的值与从另一个表中选择的值无关 - 尽管没有ORDER BY子句,这些将是一个完全随意的样本,它很容易检索。
Serial列实际上是一个Integer列,其中定义了一个默认值,该值从一个名为Sequence的特殊对象中获取下一个值。 Sequence是一个与事务无关的计数器,从1开始,并且永远不会重绕,即使读取并丢弃了一个值。
因此,如果您的序列值很高,那么因为您已经请求它的许多值 - 可能是您以后删除的插入,您回滚的事务或中止的语句中途出错。
您可以使用setval()
功能手动重置序列;一个有用的方法是setval(pg_get_serial_sequence('r4a', 'gid'), 1)
但是请记住,这并不关心已经在表格中插入了什么值,因此如果它生成了已经存在的ID,您将会遇到重复的密钥错误那里(重复插入将继续递增序列并最终生成尚未使用的ID,但这不是您希望生产代码依赖的东西!)。