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

Seb*_*idz 5 postgresql types create-table

我想在 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;
Run Code Online (Sandbox Code Playgroud)

结果如下:

name             sql_type
text             regtype
-------------------------------------
my_field_1      character varying
my_field_2      character varying
my_field_3      numeric
Run Code Online (Sandbox Code Playgroud)

预期结果:

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)
Run Code Online (Sandbox Code Playgroud)

我目前使用的是 PostgreSQL 9.6

Lau*_*lbe 4

该类型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)
);
Run Code Online (Sandbox Code Playgroud)

您可以添加更多检查约束,以确保不存在禁止的组合,例如character varying具有数字精度的 a ,或者numeric_precision必须是NOT NULLwhen numeric_scaleis 。

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