如何在postgreSQL中创建包含长度和精度参数的regtype列
我想在postgreSQL数据库中存储一些元信息。 这需要存储列类型信息。我知道regtype,但它不存储关于长度或精度的信息 我怎样才能做到这一点。我可以使用一个文本列来代替,但是我需要处理所有的验证和引用完整性。有没有更方便的方法来实现这一点 下面我给出示例代码如何在postgreSQL中创建包含长度和精度参数的regtype列,postgresql,types,create-table,Postgresql,Types,Create Table,我想在postgreSQL数据库中存储一些元信息。 这需要存储列类型信息。我知道regtype,但它不存储关于长度或精度的信息 我怎样才能做到这一点。我可以使用一个文本列来代替,但是我需要处理所有的验证和引用完整性。有没有更方便的方法来实现这一点 下面我给出示例代码 CREATE TABLE foo (name TEXT, sql_type regtype); INSERT INTO foo VALUES('my_field_1', 'character varying'::regtype);
CREATE TABLE foo
(name TEXT,
sql_type regtype);
INSERT INTO foo
VALUES('my_field_1', 'character varying'::regtype);
INSERT INTO foo
VALUES('my_field_2', 'VARCHAR(50)'::regtype);
INSERT INTO foo
VALUES('my_field_3', 'NUMERIC(32,16)'::regtype);
SELECT * from foo;
结果如下:
name sql_type
text regtype
-------------------------------------
my_field_1 character varying
my_field_2 character varying
my_field_3 numeric
预期结果:
name sql_type
text regtype
-------------------------------------
my_field_1 character varying <-- I won't need such cases
my_field_2 character varying(50)
my_field_3 numeric(32,16)
名称sql\u类型
文本正则类型
-------------------------------------
my_field_1 character variabling类型regclass
是一种方便的类型,内部只是该类型的数字对象标识符,因此它不包含有关比例、精度、长度和其他类型修饰符的信息
我会将类型及其修饰符存储为text
但如果你愿意,你也可以这样做:
CREATE TABLE coldef (
column_name name NOT NULL,
data_type regtype NOT NULL,
numeric_precision smallint
CHECK (numeric_precision IS NULL
OR numeric_precision BETWEEN 1 AND 1000),
numeric_scale smallint
CHECK (numeric_scale IS NULL
OR numeric_scale BETWEEN 0 AND numeric_precision),
character_maximum_length integer
CHECK (character_maximum_length IS NULL
OR character_maximum_length BETWEEN 1 AND 10485760),
datetime_precision smallint
CHECK (datetime_precision IS NULL
OR datetime_precision BETWEEN 0 AND 6),
interval_precision smallint
CHECK (interval_precision IS NULL
OR interval_precision BETWEEN 0 AND 6)
);
您可以添加更多的检查约束,以确保不存在禁止的组合,例如使用数值精度变化的字符,或者在启用数值刻度时数值精度必须非空
从包含列元数据的目录表information\u schema.columns
中得到启发。Postgres在内部将列定义存储为regtype以及一个typmod,其中包含长度/比例/精度(请参见)。您可以使用将它们转换回字符串。@NickBarnes:谢谢您的回复,我看到typemod和format_type()都是内部C实现,在用户代码中不可用。我正在寻找SQL/PLPGSql中的解决方案您当然可以使用typemod值并在SQL中调用format\u type()
。唯一棘手的一点是首先要掌握typemod(如果您从现有表定义中提取这些类型,那么就很容易了,如果您需要自己构造它们,就不那么容易了)。但这绝对是可能的;这里有一个例子:谢谢你的回答。我想我会坚持使用包含所有类型元信息的TEXT/VARCHAR字段,比如“NUMERIC(32,16)”。如果出于某种原因,我会选择精度、比例等单独的字段,那么您是否知道会生成文本输出的SQL用户可访问函数(format_type()等效于@NickBarnes在其评论中建议的格式)?不,但用两个CASE
表达式构建这样的函数就足够简单了。