Postgresql

PostgreSQL:將行轉換為類型

  • July 31, 2021

我讀到:使用複合類型創建新表

我有一個名為 的表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 建構子不保留列名,並且總是產生匿名記錄(正如您發現的那樣)。

有關的:

引用自:https://dba.stackexchange.com/questions/247240