VH-*_*NZZ 3 postgresql datatypes composite-types
我读过:使用复合类型创建新表
我有一个名为 的表locations
,例如用 lat 表示对象。和长。坐标。
在另一个表中,我声明了一个类型的列locations
(只是为了好玩,而不是试图变得聪明),即
CREATE TABLE XXX (..., some_column locations, ...);
Run Code Online (Sandbox Code Playgroud)
现在我在问自己这意味着什么,是否可以locations
在其中存储一个对象。
这就是我试图做的:
SELECT pg_typeof(ROW(x)) FROM locations x LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
返回record
. 我尝试将其转换为locations
,即
SELECT ROW(x)::locations FROM locations X LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
这产生
Run Code Online (Sandbox Code Playgroud)ERROR: cannot cast type record to locations
接下来我尝试type_location
根据locations
表的列定义一个复合类型,并基于它创建一个类型化表( CREATE TABLE ... OF ...
)。我仍然无法做到ROW(x)::locations
。
最终,我试图将一个值存储到XXX
类型locations
(或type_location
)表中,但我不明白我的推理哪一部分是错误的。
PS:我并不是要使用这种结构来创建一个健全的数据库设计,而实际上只是在玩弄 PostgreSQL 及其类型系统。
现在我在问自己这意味着什么,以及是否可以在其中存储位置对象。
是的你可以。(但是没有很多很好的用例。)
这并不像您认为的那样:
SELECT ROW(x)::locations FROM locations X LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
x
已经是行类型。通过将其包装到ROW(x)
您创建的记录中locations
,该记录包含一个类型为 的列,该列不能强制转换为行类型,locations
因为它是其他类型。改用:
SELECT x::locations FROM locations x LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
...演员是多余的。所以就:
SELECT x FROM locations x LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
但是,如果存在同名的列,则"x"
解析为列名。选择一个永远不会作为列名出现的表别名或使用它来确保:
SELECT (x.*)::locations FROM locations x LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
现在,演员表不是多余的,因为 Postgres 否则会扩展x.*
甚至扩展(x.*)
到列列表。在此处和此处阅读手册。
也只是:
SELECT pg_typeof(x) FROM locations x LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
代替:
SELECT pg_typeof(ROW(x)) FROM locations x LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
旁白:ROW 构造函数不保留列名并且总是产生一个匿名记录(正如你发现的那样)。
有关的:
归档时间: |
|
查看次数: |
4780 次 |
最近记录: |