2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1

ALTER COLLATION

ALTER COLLATION — 更改排序規則的定義

概要

ALTER COLLATION name REFRESH VERSION

ALTER COLLATION name RENAME TO new_name
ALTER COLLATION name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER COLLATION name SET SCHEMA new_schema

描述

ALTER COLLATION 更改排序規則的定義。

要使用 ALTER COLLATION,您必須擁有該排序規則。要更改所有者,您必須能夠 SET ROLE 到新的所有者角色,並且該角色必須對排序規則的模式具有 CREATE 許可權。(這些限制確保更改所有者不會執行您無法透過刪除並重新建立排序規則來完成的操作。但是,超級使用者可以更改任何排序規則的所有權。)

引數

name

現有的排序規則的名稱(可以選擇模式限定)。

new_name

排序規則的新名稱。

new_owner

排序規則的新所有者。

new_schema

排序規則的新模式。

REFRESH VERSION

更新排序規則的版本。請參閱下面的 Notes

註釋

當建立排序規則物件時,特定提供程式的排序規則版本會記錄在系統目錄中。當使用排序規則時,當前版本會與記錄的版本進行檢查,如果存在不匹配,則會發出警告,例如:

WARNING:  collation "xx-x-icu" has version mismatch
DETAIL:  The collation in the database was created using version 1.2.3.4, but the operating system provides version 2.3.4.5.
HINT:  Rebuild all objects affected by this collation and run ALTER COLLATION pg_catalog."xx-x-icu" REFRESH VERSION, or build PostgreSQL with the right library version.

排序規則定義的更改可能導致索引損壞和其他問題,因為資料庫系統依賴於儲存的物件具有特定的排序順序。通常,應避免這種情況,但它可能在合法的情況下發生,例如升級作業系統到新的主版本,或者在使用 pg_upgrade 升級到與更新版本的 ICU 連結的伺服器二進位制檔案時。發生這種情況時,應重建所有依賴於該排序規則的物件,例如使用 REINDEX。完成後,可以使用命令 ALTER COLLATION ... REFRESH VERSION 來重新整理排序規則版本。這將更新系統目錄以記錄當前的排序規則版本,並使警告消失。請注意,這並不會實際檢查所有受影響的物件是否已正確重建。

當使用 libc 提供的排序規則時,版本資訊會在使用 GNU C 庫(大多數 Linux 系統)、FreeBSD 和 Windows 的系統上記錄。當使用 ICU 提供的排序規則時,版本資訊由 ICU 庫提供,並且在所有平臺上都可用。

注意

當使用 GNU C 庫進行排序規則時,C 庫的版本被用作排序規則版本的代理。許多 Linux 發行版僅在升級 C 庫時更改排序規則定義,但這種方法並不完美,因為維護者可以自由地將較新的排序規則定義回溯移植到舊的 C 庫版本。

當在 Windows 上使用排序規則時,僅對於使用 BCP 47 語言標籤(例如 en-US)定義的排序規則,版本資訊才可用。

對於資料庫預設排序規則,有一個類似的命令 ALTER DATABASE ... REFRESH COLLATION VERSION

可以使用以下查詢來識別當前資料庫中所有需要重新整理的排序規則及其依賴的物件:

SELECT pg_describe_object(refclassid, refobjid, refobjsubid) AS "Collation",
       pg_describe_object(classid, objid, objsubid) AS "Object"
  FROM pg_depend d JOIN pg_collation c
       ON refclassid = 'pg_collation'::regclass AND refobjid = c.oid
  WHERE c.collversion <> pg_collation_actual_version(c.oid)
  ORDER BY 1, 2;

示例

將排序規則 de_DE 重新命名為 german

ALTER COLLATION "de_DE" RENAME TO german;

將排序規則 en_US 的所有者更改為 joe

ALTER COLLATION "en_US" OWNER TO joe;

相容性

SQL 標準中沒有 ALTER COLLATION 語句。

提交更正

如果您在文件中發現任何不正確、與您的實際體驗不符或需要進一步解釋的內容,請使用 此表單 報告文件問題。