its*_*sME 5 postgresql database-design auto-increment postgresql-9.2
我在 PostgreSQL 中有一个用于医院患者的表,我想将它的主键设置为PAT0000001
( char varying
) 并将该字段保持为自动增量。
有没有办法实现这一目标?
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)
为查询,并反转显示给用户。
归档时间: |
|
查看次数: |
13514 次 |
最近记录: |