Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在postgreSQL中创建包含长度和精度参数的regtype列_Postgresql_Types_Create Table - Fatal编程技术网

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

如何在postgreSQL中创建包含长度和精度参数的regtype列,postgresql,types,create-table,Postgresql,Types,Create Table,我想在postgreSQL数据库中存储一些元信息。 这需要存储列类型信息。我知道regtype,但它不存储关于长度或精度的信息 我怎样才能做到这一点。我可以使用一个文本列来代替,但是我需要处理所有的验证和引用完整性。有没有更方便的方法来实现这一点 下面我给出示例代码 CREATE TABLE foo (name TEXT, sql_type regtype); INSERT INTO foo VALUES('my_field_1', 'character varying'::regtype);

我想在postgreSQL数据库中存储一些元信息。 这需要存储列类型信息。我知道regtype,但它不存储关于长度或精度的信息

我怎样才能做到这一点。我可以使用一个文本列来代替,但是我需要处理所有的验证和引用完整性。有没有更方便的方法来实现这一点

下面我给出示例代码

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)
名称sql\u类型
文本正则类型
-------------------------------------

my_field_1 character variabling类型
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)
);
您可以添加更多的检查约束,以确保不存在禁止的组合,例如使用数值精度变化的
字符,或者在启用
数值刻度时
数值精度必须
非空


从包含列元数据的目录表
information\u schema.columns
中得到启发。

Postgres在内部将列定义存储为regtype以及一个typmod,其中包含长度/比例/精度(请参见)。您可以使用将它们转换回字符串。@NickBarnes:谢谢您的回复,我看到typemod和format_type()都是内部C实现,在用户代码中不可用。我正在寻找SQL/PLPGSql中的解决方案您当然可以使用typemod值并在SQL中调用
format\u type()
。唯一棘手的一点是首先要掌握typemod(如果您从现有表定义中提取这些类型,那么就很容易了,如果您需要自己构造它们,就不那么容易了)。但这绝对是可能的;这里有一个例子:谢谢你的回答。我想我会坚持使用包含所有类型元信息的TEXT/VARCHAR字段,比如“NUMERIC(32,16)”。如果出于某种原因,我会选择精度、比例等单独的字段,那么您是否知道会生成文本输出的SQL用户可访问函数(format_type()等效于@NickBarnes在其评论中建议的格式)?不,但用两个
CASE
表达式构建这样的函数就足够简单了。