我想在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
答案 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
中获取灵感。