如何使用PostgreSQL序列更新SQL中的唯一值?

17

在SQL中,如何更新一个表的每一行并将其中的某一列设置为不同的值?

我想要更新PostgreSQL数据库中的一些行,将其中的一个列设置为来自序列的数字,该列具有唯一约束条件。我希望我只需要使用以下内容:

update person set unique_number = (select nextval('number_sequence') );

但是看起来nextval只被调用了一次,所以更新每一行时使用相同的数字,导致出现“违反唯一约束”的错误。我应该怎么做?

2个回答

38

不要使用子查询,而是直接使用nextval函数,就像这样:

update person set unique_number = nextval('number_sequence');

谢谢 - 那个有效。我被子查询卡住了,因为我试图为两列使用相同的序列号,但我实际上并不需要这样做。 - Peter Hilton
1
如果您在调用nextval('sequence')之后想要重复使用相同的序列值,则可以使用相关函数currval('sequence'),该函数返回当前序列。 - cms

-1

我认为pg的sequences是hack和逐渐增加的整数不是对行进行键入的最佳方式的迹象。尽管pg没有在8.3之前获得UUID的原生支持。

http://www.postgresql.org/docs/8.3/interactive/datatype-uuid.html

UUID的好处在于组合方式几乎是无限的,不像随机数一样会有一天撞上碰撞。

“近乎无限?”文档中说它是一个128位整数类型。这很多,但并不是无限的,并且在使用所有2^128个值之前几乎肯定会发生冲突。此外,ORM可能需要转换为/从字符串类型以使用此功能。在我看来,这并不是一个明显的胜利。 - wberry
2
我认为你低估了2^128的大小,请在维基百科上阅读有关UUID的内容。 - TravisO
这主要是学术性的,但根据它的创建方式,Postgres序列可以比UUID更具防冲突性。Python的uuid模块使用随机组件,但远不到128个随机位数。如果序列循环,它们才会产生冲突,而随机数则可能会出现碰撞... 随机地。 - wberry
Postgres有自己的uuid生成器,我还没有见过,但它可能比Python的更好,就此而言。 - Ghoti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接