【发布时间】:2018-06-25 01:51:04
【问题描述】:
我想在 postgreSQL 数据库中存储一些元信息。 这需要存储列类型信息。我知道 regtype 类型,但它不存储有关长度或精度的信息。
我怎样才能做到这一点。我可以改用 TEXT 列,但是我需要处理所有的验证和参照完整性。有没有更方便的方法来实现这一点?
下面我给出示例代码。
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)
我目前使用的是 PostgreSQL 9.6
【问题讨论】:
-
Postgres 在内部将列定义存储为 regtype 以及 typmod,它保存长度/比例/精度(请参阅docs)。您可以使用
format_type()将它们转回字符串。 -
@NickBarnes:感谢您的回复,我看到 typemod 和 format_type() 都是内部 C 实现,并且在用户代码中不可用。我正在寻找 SQL / plpgsql 中的解决方案
-
您当然可以使用 typemod 值并在 SQL 中调用
format_type()。唯一棘手的一点是首先掌握一个 typemod(如果您从现有的表定义中提取这些类型很容易,如果您需要自己构建它们就不是那么容易了)。但这绝对是可能的;这是一个例子:rextester.com/JLK17510
标签: postgresql types create-table