我有现有的数据库,我已将SQLAlchemy迁移到新的PostgreSQL数据库。
我使用与以前相同的值移动了所有主键。现在我有填充数据的表,但相关的序列从1开始。我有pk值存储1到2000.
现在,当我尝试用Django保存时,我有
重复键值违反了唯一约束 关于主键。
如何修改序列起始值或逃避这种情况?
我目前的解决方案是:
conn = psycopg2.connect(...)
for table_name in table_names:
cursor = conn.cursor()
cursor.execute("""
SELECT setval('%s_id_seq', (SELECT COALESCE(MAX(id),0)+1 FROM %s));
"""% (table_name, table_name))
它对我有用,但我不喜欢它。
答案 0 :(得分:7)
(不一定是max(id)
)。
在问题中你有简单的方法。您可以使用setval()
SELECT setval('tbl_id_seq');
然后是ALTER SEQUENCE
执行相同的标准SQL方式:
ALTER SEQUENCE myseq RESTART WITH 1;
如果您想以默认值1以外的数字重新启动序列:
CREATE TABLE foo(id serial, a text); -- creates sequence "foo_id_seq"
INSERT INTO foo(a) VALUES('a'); -- seq. starts with --> 1
ALTER SEQUENCE foo_id_seq START WITH 10; -- doesn't restart sequence
INSERT INTO foo(a) VALUES('b'); --> 2
ALTER SEQUENCE foo_id_seq RESTART; -- restarts sequence
INSERT INTO foo(a) VALUES('c'); --> 10
当您使用TRUNCATE清空表时,还有另一种方法:
TRUNCATE foo RESTART IDENTITY;
隐式执行ALTER SEQUENCE foo_id_seq RESTART;