Postgresql
PostgreSQL:將行轉換為類型
我讀到:使用複合類型創建新表
我有一個名為 的表
locations
,例如用 lat 表示對象。並且很長。座標。在另一個表中,我聲明了一個類型的列
locations
(只是為了好玩,不是為了聰明),即CREATE TABLE XXX (..., some_column locations, ...);
現在我在問自己這意味著什麼以及我是否可以
locations
在其中儲存一個對象。這就是我試圖做的事情:
SELECT pg_typeof(ROW(x)) FROM locations x LIMIT 1;
返回
record
。我嘗試將其轉換為locations
,即SELECT ROW(x)::locations FROM locations X LIMIT 1;
產生
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;
x
已經是一個行類型。通過將它包裝到ROW(x)
你創建一個包含type 列的記錄locations
,它不能轉換為 row 類型locations
,因為它是別的東西。改用:SELECT x::locations FROM locations x LIMIT 1;
…演員陣容是多餘的。所以就:
SELECT x FROM locations x LIMIT 1;
但是,如果存在同名的列,則會
"x"
解析為列名。選擇一個永遠不會作為列名出現的表別名,或者使用它來確保:SELECT (x.*)::locations FROM locations x LIMIT 1;
現在,演員表不是多餘的,因為 Postgres 會擴展
x.*
甚至擴展(x.*)
到列列表。在此處和此處閱讀手冊。也只是:
SELECT pg_typeof(x) FROM locations x LIMIT 1;
代替:
SELECT pg_typeof(ROW(x)) FROM locations x LIMIT 1;
另外:ROW 建構子不保留列名,並且總是產生匿名記錄(正如您發現的那樣)。
有關的: