从特定数字增加PK列(PostgreSQL)

时间:2013-11-28 09:40:50

标签: sql postgresql auto-increment

在我的PostgreSQL数据库中,我有一个表users,它有两列,PK named uid(serial)user_type(integer)。对于普通用户(user_type 1) uid从0开始(并且定期递增),对于非常规用户(user_type 2), uid是否可能从(让我们说)开始)5000 ,并在每次添加新的非常规用户时从该数字(5000,5001,5002 ......)增加?

我的常规用户不会超过2000,因此常规和非常规用户的uid之间不会发生重叠。

1 个答案:

答案 0 :(得分:4)

serial数据类型将创建一个序列,并从该序列中提取列的默认值。对于您要做的事情,您需要两个序列,从这些序列中提取并明确插入uid。这不是serial可以也不应做的事情。

要回显@a_horse_with_no_name,您不应将信息放入serial数据类型。生成的主键只有在对表用户完全不透明时才可接受。请考虑让serial完成其工作并更新您的应用程序代码,以便对user_type做出正确反应。由于您的关注似乎是与外部实体的id冲突,我建议将外部系统生成的用户ID存储在单独的字段中,比如extern_uid

或让外部系统生成UUID个字符串,您可以在uid列中安全使用这些字符串。如果外部系统也是PostgresSQL数据库,您可以使用uuid-ossp module生成UUID / GUID。

如果您绝对 使用序列,则需要:

CREATE SEQUENCE uid_one START 1;
CREATE SEQUENCE uid_two START 5000;

INSERT INTO user (uid, user_type) VALUES (nextval('uid_one'::regclass), 1);
INSERT INTO user (uid, user_type) VALUES (nextval('uid_two'::regclass), 2);

选择适当的声明留给应用程序。