Postgres 中的主键分配
Primary Key assignment in Postgres
我的 postgres 数据库中有 table tmp
,其中包含大约 1.39 亿条记录。我正在尝试将 col1
、col2
和 col3
列移动到另一个 [=34] 的 col1
、col2
和 col3
=]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,但这不是您希望生产代码依赖的东西!)。
我的 postgres 数据库中有 table tmp
,其中包含大约 1.39 亿条记录。我正在尝试将 col1
、col2
和 col3
列移动到另一个 [=34] 的 col1
、col2
和 col3
=]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,但这不是您希望生产代码依赖的东西!)。