Postgres 中的主键分配

Primary Key assignment in Postgres

我的 postgres 数据库中有 table tmp,其中包含大约 1.39 亿条记录。我正在尝试将 col1col2col3 列移动到另一个 [=34] 的 col1col2col3 =]d 名为 r4a。我用这个查询创建了 table 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 中的字段:

INSERT INTO r4a (col1,col2,col3)
SELECT col1, col2, col3
FROM tmp
limit 500;

它用 [14816024-14816523] 范围内的数字填充 gid [PK] serial 列。

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

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

为 Serial 列选择的值与从其他列选择的值无关 table - 尽管没有 ORDER BY 子句,这些将是一个完全任意的样本,恰好很容易检索.

Serial 列实际上是一个 Integer 列,它定义了一个默认值,该值从一个称为 Sequence 的特殊对象中获取下一个值。 Sequence 是一个独立于事务的计数器,它从 1 开始,并且永远不会倒带,即使读取并丢弃一个值也是如此。

因此,如果您的序列值那么高,那是因为您已经从中请求了那么多值 - 可能在您后来删除的插入、回滚的事务或中途中止的语句中错误。

您可以使用setval()函数手动重置序列;一个有用的方法是 setval(pg_get_serial_sequence('r4a', 'gid'), 1) 但请记住,这不会关心已经将哪些值插入 table,因此如果它生成一个已经存在的 ID(重复insert 将继续递增序列并最终生成一个尚未使用的 ID,但这不是您希望生产代码依赖的东西!)。