gpt4 book ai didi

postgresql - 如何在包含长度和精度参数的 postgreSQL 中创建 regtype 列

转载 作者:行者123 更新时间:2023-11-29 11:46:48 25 4
gpt4 key购买 nike

我想在 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

最佳答案

regclass 类型是一种方便的类型,在内部只是该类型的数字对象标识符,因此它不包含有关比例、精度、长度和其他类型修饰符的信息.

会将类型及其修饰符一起存储为文本

但如果你愿意,你也可以这样做:

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)
);

您可以添加更多检查约束以确保没有禁止的组合,例如具有数字精度的 character varying,或者 numeric_precision 必须是 numeric_scale 为 NULL 时。

从包含列元数据的目录表 information_schema.columns 中获得灵感。

关于postgresql - 如何在包含长度和精度参数的 postgreSQL 中创建 regtype 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48279815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com