postgresql 表的Postgres primary_key-唯一约束错误

7jmck4yq  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(315)

我安装了postgresql - docker[postgres:9.6.24]并手动保存了表中的一些行,比如说,我添加了10行。
当我使用SQLAlchemy在表中插入新行时,得到了这个错误
sqlalchemy.exc.IntegrityError:(psycopg2.errors.UniqueViolation)重复键值违反唯一约束“bird_pkey”DETAIL:Key(bird_id)=(1)已存在。
密码-

session = self.Session()
bird_data = Bird(name='Parrot', population=50)
session.add(vehicle)
session.commit()

表─

class Bird(Base):
    __tablename__ = 'bird'
    bird_id = Column(Integer, primary_key=True)
    name = Column(String)
    population = Column(Integer)

但是,Bird表中已经保存了10条记录。我不知道为什么主键显示唯一的约束错误,因为它通常是自动计算新记录的主键值。
如何解决这个问题
我尝试this answer,但我得到了语法错误

create sequence bird_seq increment 1 start 11;
SELECT nextval('bird_seq');
select setval('bird_seq', (select max(bird_id) from bird)+1);

但这也不起作用,我得到了同样的错误,但这次bird_id被分配给2
sqlalchemy.exc.IntegrityError:(psycopg2.errors.UniqueViolation)重复键值违反唯一约束“bird_pkey”DETAIL:Key(bird_id)=(2)已存在。
如何解决这个问题?
这个表的主键没有正确分配,现在我想知道,这个问题会导致所有其他表在插入新记录时出错?如果是,如何解决数据库中所有表的此问题
谢谢

rbpvctlc

rbpvctlc1#

你创建了一个表,然后手动插入数据,你说,然后可能没有定义主键。然后用SQLAlchemy定义表,它正确地完成了这项工作,并在列上插入了一个序列和主键标志。现在,当您尝试插入数据时,它会失败,因为SQLAlchemy主键序列从1开始,并且您已经拥有了具有此bird_id的行
最简单的方法是清除您手动插入的数据。
如果出于某种原因不愿意这样做,那么需要找到SQLAlchemy创建的序列的名称,并将其递增。如果新序列不是与此表的主键关联的序列,则创建新序列并将其递增将不会产生任何效果。

相关问题