gpt4 book ai didi

database - 在postgresql中,导入csv文件后,序列号不同步

转载 作者:行者123 更新时间:2023-11-29 12:50:21 29 4
gpt4 key购买 nike

我将现有的 MSSQL 数据移动到 postgreSQL。

我在此过程中导入/导出了 csv 文件。

并且序号依次录入数据。

当我将新值放入应用程序后,序列号无法正常工作。

可以看到,postgresql中的sequence还是固定为1

我想知道为什么它不同步。

谢谢。

最佳答案

问题陈述

就您而言,您遇到的问题听起来像是您已执行以下操作:

  1. 已导出序列号的数据
  2. 将导出内容导入 Postgres 数据库
  3. 试图插入额外的数据,发现序列号是:
    a) 产生冲突,因为它试图插入现有序列号的副本;或者
    b) 成功插入现有序列号的副本

Postgres 中连续出版物的背景

在 PostgreSQL 中,serial 数据类型实际上是一个 integer 列的简写,它有一个关联的 sequence,它控制着默认行为专栏。

来自documentation :

The data types smallserial, serial and bigserial are not true types, but merely a notational convenience for creating unique identifier columns (similar to the AUTO_INCREMENT property supported by some other databases).

您可以通过检查列的默认值来验证该行为(例如,通过在 psql 中使用 \d+)。 Default 列应该类似于:nextval('schema.id_seq'::regclass)。文档中值得强调的是:

In most cases you would also want to attach a UNIQUE or PRIMARY KEY constraint to prevent duplicate values from being inserted by accident, but this is not automatic.

作为旁注,重要的是要注意序列 do not promise that values will be consecutive .

解决方案

之所以可能会出现您所描述的情况,是因为仅在未明确提供值时才调用生成新值的序列。

当您将 serial 视为整数和默认值时,这开始变得更有意义了。 Postgres 跟踪下一个应该使用哪个值的方式是通过序列,并且它只会在您没有明确提供值时从序列中分配新值。

解决这个问题的方法是使用 setval 设置 nextval Postgres 中的函数。具体如何执行此操作有许多不同的策略,具体取决于您是否想要:

Here's an answer如何将序列设置为特定值的相关问题。

一个简单的例子

下面的示例展示了向插入/上传提供显式值如何使用默认/序列,以及下一个使用的插入将如何沿现有序列继续。

CREATE TABLE test (id serial, sample integer);
INSERT INTO test (sample) VALUES (101); -- assigns default, next value from id_seq (1)
INSERT INTO test (id, sample) VALUES (3, 102); -- assigns explicit value (3)
INSERT INTO test (sample) VALUES (103); -- assigns default, next value from id_seq (2)

关于database - 在postgresql中,导入csv文件后,序列号不同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55485135/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com