如何在postgreSQL中创建包含length和precision参数的regtype列

时间:2018-01-16 11:07:20

标签: 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;

结果如下:

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

1 个答案:

答案 0 :(得分:1)

类型controller.setTargetRect(view.frame, inView: mapView) 是一种便利类型,内部只是类型的数字对象标识符,因此它不包含有关比例,精度,长度和其他类型修饰符的信息。

会将该类型及其修饰符存储为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) ); 具有数字精度,或character varying必须numeric_precision {{1}是的。

从包含列元数据的目录表NOT NULL中获取灵感。