Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 在postgresql中,导入csv文件后,序列号不同步_Database_Postgresql_Auto Increment_Serial Number - Fatal编程技术网

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

Database 在postgresql中,导入csv文件后,序列号不同步,database,postgresql,auto-increment,serial-number,Database,Postgresql,Auto Increment,Serial Number,我将现有的MSSQL数据移动到postgreSQL 在此过程中,我导入/导出了csv文件 序列号按顺序输入数据 当我在应用程序中输入新值时,序列号没有正常工作 如您所见,postgresql中的序列仍然固定为1 我想知道为什么它不同步 谢谢。如果通过复制命令导入csv文件,则必须使用序列函数将值设置为序列: 之后,您可以从应用程序中输入一个新值 在您的情况下,听起来您遇到的问题是您已经完成了以下工作: 已具有序列号的导出数据 已将导出导入Postgres数据库 尝试插入其他数据,发现序列号为:

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

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

序列号按顺序输入数据

当我在应用程序中输入新值时,序列号没有正常工作

如您所见,postgresql中的序列仍然固定为1

我想知道为什么它不同步


谢谢。

如果通过复制命令导入csv文件,则必须使用序列函数将值设置为序列:

之后,您可以从应用程序中输入一个新值 在您的情况下,听起来您遇到的问题是您已经完成了以下工作:

  • 已具有序列号的导出数据
  • 已将导出导入Postgres数据库
  • 尝试插入其他数据,发现序列号为:
    a) 生成冲突,因为它试图插入现有序列号的副本;或
    b) 已成功插入现有序列号的副本
  • Postgres系列文章的背景 在PostgreSQL中,
    serial
    数据类型实际上是
    integer
    列的简写,该列具有关联的
    sequence
    ,该序列控制该列的默认行为

    从:

    数据类型smallserial、serial和bigserial不是真正的类型,只是创建唯一标识符列的一种符号方便(类似于某些其他数据库支持的AUTO_INCREMENT属性)

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

    在大多数情况下,您还希望附加唯一或主键约束,以防止意外插入重复的值,但这不是自动的

    作为旁注,重要的是要注意序列

    解决方案 之所以可能出现您所描述的情况,是因为只有在未明确提供值的情况下才会调用生成新值的序列。

    当您将
    serial
    s看作整数和默认值时,这就开始变得更有意义了。Postgres跟踪下一步应该使用哪个值的方式是通过序列进行的,它只是在您没有明确提供值的情况下从序列中分配新值。

    解决此问题的方法是使用Postgres中的函数设置
    nextval
    。根据您是否愿意,有许多不同的策略来具体说明如何做到这一点:

    • 重置所有序列号
    • 保留所有现有序列号并从下一个值开始
    • 其他一些定制解决方案
    关于如何将序列设置为特定值的相关问题

    一个微不足道的例子 下面的示例显示了向insert/upload提供显式值是如何而不是使用默认/序列的,以及下一次插入将如何沿现有序列继续

    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)
    
    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)