以某些字符为前缀的自动增量字符变化列

its*_*sME 5 postgresql database-design auto-increment postgresql-9.2

我在 PostgreSQL 中有一个用于医院患者的表,我想将它的主键设置为PAT0000001( char varying) 并将该字段保持为自动增量

有没有办法实现这一目标?

Cra*_*ger 7

PostgreSQL 没有 MySQL 意义上的“自动增量”字段AUTO_INCREMENT,但我猜你的意思是SERIAL.

如果是这样,是的,您所描述的情况是可能的,但是请不要这样做。

ASERIAL只是 aCREATE SEQUENCE和默认值的简写。例如

CREATE TABLE blah(
   id serial primary key
);
Run Code Online (Sandbox Code Playgroud)

实际上是简写:

CREATE SEQUENCE blah_id_seq;

CREATE TABLE blah (
    id integer primary key default nextval('blah_id_seq'::regclass)
);

ALTER SEQUENCE blah_id_seq OWNED BY blah.id;
Run Code Online (Sandbox Code Playgroud)

您可以使用这些知识将nextval返回转换为字符类型,例如

CREATE TABLE thisiswrong (
    id text primary key default CAST(nextval('thisiswrong_id_seq'::regclass) AS text)
);
Run Code Online (Sandbox Code Playgroud)

但是,我再次请求你,不要这样做。这太糟糕了。这是错的。你会后悔的。无论您想做什么,都有比 this 更好的方法

我故意没有展示如何生成像 一样的格式化字段PAT000001,但是您可以在 a 中使用任何表达式DEFAULT,而不仅仅是 a CAST。因此,如果您坚持,请查看to_char函数或format函数以了解如何执行此操作。

做你想做的事情的正确方法是不去做。让应用程序显示代码,就像PAT000001它看到like的主键值patient_id一样1。用户永远不需要知道你只是存储整数。

如果您想要其他前缀,如PAT,DOC等,请使用复合主键,例如

CREATE TABLE saner_ish (
    categorycode varchar(3) CHECK (length(categorycode) = 3),
    patient_id integer default nextval('saner_ish_patient_id'::regclass),
    PRIMARY KEY (categorycode, patient_id)
);
Run Code Online (Sandbox Code Playgroud)

(可能带有enum类型、IN列表或用于验证的任何内容)。

然后在应用程序中PAT00001转化('PAT', 1)为查询,并反转显示给用户。