我需要将人员的ID存储在Database.But中,id应该包含一个alpha开头,我已经按照以下内容,
对于id列我设置了默认值,如
create table alphanumeric (id int default ('f'||nextval('seq_test'))::int) ;
所以现在表格就像
一样default (('f'::text || nextval('seq_test'::regclass)))::integer
创建表格后,我插入显示错误的值,如
INSERT INTO alpha VALUES (default) ;
ERROR: invalid input syntax for integer: "f50"
我理解错误,但我需要这种类型的存储.....!
注意:我不想使用函数或触发器。
答案 0 :(得分:3)
只需在@ muistooshort的答案中添加几美分。如果您确定所需的ID始终符合某个正则表达式,则可以使用CHECK
约束强制执行该操作:
CREATE TABLE alphanumeric (
id VARCHAR DEFAULT ('f' || nextval('seqtest') PRIMARY KEY,
...
CHECK(id ~ '^[A-Za-z][0-9]+')
);
当然,我对您的标识符的性质做了一个粗略的假设,您必须自己判断您的标识符是否构成常规语言。
其次,@muistooshort谈论的排序顺序有时(令人困惑)称为“自然排序”和you can get a PostgreSQL function to assist with this。
答案 1 :(得分:2)
您希望为id
使用字符串,因此请为id
使用文字列:
create table alphanumeric (
id text default ('f' || nextval('seq_test'))
)
如果您只对该列使用seq_test
,那么您可能希望它为owned by that column:
alter sequence seq_test owned by alphanumeric.id
这样一来,如果删除表格就会删除序列,并且不会有一个未使用的序列使数据库混乱。
你可能想要注意的关于这个id
计划的一件事是他们不会按照人类对它们进行排序的方式进行排序;例如,'f100' < 'f2'
将是正确的,这可能会产生您需要解决的副作用。