Dmi*_*nko 2 django postgresql auto-increment django-south
我有和现有的数据库,我已经用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))
Run Code Online (Sandbox Code Playgroud)
它对我有用,但我不喜欢它.
(不一定max(id)).
你在问题中有简单的方法.您可以使用以下命令将序列设置为以任意数字开头setval():
SELECT setval('tbl_id_seq');
Run Code Online (Sandbox Code Playgroud)然后是标准的SQL方式ALTER SEQUENCE做同样的事情:
ALTER SEQUENCE myseq RESTART WITH 1;
Run Code Online (Sandbox Code Playgroud)如果您想以非默认值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
Run Code Online (Sandbox Code Playgroud)还有另一种方法,当你用TRUNCATE清空一个表时:
TRUNCATE foo RESTART IDENTITY;
Run Code Online (Sandbox Code Playgroud)
隐式执行 ALTER SEQUENCE foo_id_seq RESTART;
| 归档时间: |
|
| 查看次数: |
2524 次 |
| 最近记录: |