Database 在postgresql中,导入csv文件后,序列号不同步
我将现有的MSSQL数据移动到postgreSQL 在此过程中,我导入/导出了csv文件 序列号按顺序输入数据 当我在应用程序中输入新值时,序列号没有正常工作 如您所见,postgresql中的序列仍然固定为1 我想知道为什么它不同步Database 在postgresql中,导入csv文件后,序列号不同步,database,postgresql,auto-increment,serial-number,Database,Postgresql,Auto Increment,Serial Number,我将现有的MSSQL数据移动到postgreSQL 在此过程中,我导入/导出了csv文件 序列号按顺序输入数据 当我在应用程序中输入新值时,序列号没有正常工作 如您所见,postgresql中的序列仍然固定为1 我想知道为什么它不同步 谢谢。如果通过复制命令导入csv文件,则必须使用序列函数将值设置为序列: 之后,您可以从应用程序中输入一个新值 在您的情况下,听起来您遇到的问题是您已经完成了以下工作: 已具有序列号的导出数据 已将导出导入Postgres数据库 尝试插入其他数据,发现序列号为:
谢谢。如果通过复制命令导入csv文件,则必须使用序列函数将值设置为序列: 之后,您可以从应用程序中输入一个新值 在您的情况下,听起来您遇到的问题是您已经完成了以下工作:
a) 生成冲突,因为它试图插入现有序列号的副本;或
b) 已成功插入现有序列号的副本
serial
数据类型实际上是integer
列的简写,该列具有关联的sequence
,该序列控制该列的默认行为
从:
数据类型smallserial、serial和bigserial不是真正的类型,只是创建唯一标识符列的一种符号方便(类似于某些其他数据库支持的AUTO_INCREMENT属性)
您可以通过检查列的默认值来验证该行为(例如,在psql中使用\d+
)。Default
列应该类似于:nextval('schema.id\u seq':regclass)
。值得从文档中强调的是:
在大多数情况下,您还希望附加唯一或主键约束,以防止意外插入重复的值,但这不是自动的
作为旁注,重要的是要注意序列
解决方案
之所以可能出现您所描述的情况,是因为只有在未明确提供值的情况下才会调用生成新值的序列。
当您将serial
s看作整数和默认值时,这就开始变得更有意义了。Postgres跟踪下一步应该使用哪个值的方式是通过序列进行的,它只是在您没有明确提供值的情况下从序列中分配新值。
解决此问题的方法是使用Postgres中的函数设置nextval
。根据您是否愿意,有许多不同的策略来具体说明如何做到这一点:
- 重置所有序列号
- 保留所有现有序列号并从下一个值开始
- 其他一些定制解决方案
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)