2014-06-24 236 views
1

我新的PostgreSQL中,当我测试我的插入代码时,我得到以下错误消息PostgreSQL的 - 错误23505重复键值违反唯一约束“foo_column_key”(不是主键)

错误异常(“错误','23505','重复键值违反唯一约束“foo_column_key”');

我曾尝试在cursor.execute()代码后面使用connection.commit()或connection.rollback()。

问题:

我怎么能解决这个错误,而无需重新创建表像命令 “选择SETVAL( 'foo_id_seq',1)”?在我尝试使用“reindex table foo;”之前从postgres但不工作,并运行提交或从psql回滚不工作(也许不同的连接ID)。也搜索谷歌重置所有交易数据或使用搜索关键字我的标题上面,但没有找到任何解决方案。

任何人都可以帮助我或告诉我解决这个问题的方向?

谢谢。

编辑:

对不起,也许这给清楚我的问题:

insert into foo(foo_column) values('[email protected]'); 

起初我:

create table foo(
    foo_id serial unique not null primary key, 
    foo_column character(35) unique not null 
); 

我从我的编程代码插入带有此SQL命令数据通过“select * from foo;”检查表中的数据,但没有数据插入。再次我通过刷新页面(cgi应用程序)重新运行代码,并且我得到了该消息,然后我再次检查select * from foo;,但没有插入任何内容。这是我第一次使用插入事务,在我没有事务的情况下使用mysql之前。

我试图找到解决方案,但总是发现解决方案是列serial/bigserial主键,我好奇,所以我问这里。有没有解决这个错误,而无需重新创建表的任何方法?

希望这可以让你更清楚地了解我的问题和感谢。

回答

3

显然,从消息中,您试图在已存在的列中插入一个值。如果你在这个字段上有一个序列器(比如一个串行列类型),它可能与表不同步,因为你已经完成了一个插入并提供了一个值(而不是让“default”机制通过获取nextval从序列发生器)。如果是这种情况,请使用setval语句将该音序器重置为该字段的最大值(谷歌如何做到这一点 - 该主题上的许多帖子)。或者只是保持尝试插入,直到其中一个神奇的作品! ;)

+0

ALTER SEQUENCE seq RESTART WITH(SELECT(max(id)+ 1)FROM table); – frt

+0

相关文档:[ALTER SEQUENCE](https://www.postgresql.org/docs/current/static/sql-altersequence.html),[max(id)](https://www.postgresql.org/docs /current/static/functions-aggregate.html) – frt

相关问题