在我的PostgreSQL数据库中,我有一个表users
,它有两列,PK named uid(serial)
和user_type(integer)
。对于普通用户(user_type 1) uid从0开始(并且定期递增),对于非常规用户(user_type 2), uid是否可能从(让我们说)开始)5000 ,并在每次添加新的非常规用户时从该数字(5000,5001,5002 ......)增加?
我的常规用户不会超过2000,因此常规和非常规用户的uid之间不会发生重叠。
答案 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);
选择适当的声明留给应用程序。