PostgreSQL 有一个用于表、函数、视图、规则等的“ OR REPLACE
”变体(如“ CREATE OR REPLACE ____
”),但是它没有用于类型的变体。
我可以去提交错误报告,但我想这是维护人员的故意决定。我的问题是:为什么?
换句话说,类型有何不同使得它们不需要OR REPLACE
(即使表、函数等需要)?
PS 我刚刚发现它确实有一个DROP TYPE IF EXISTS
... 这让我更加困惑。它似乎真的CREATE TYPE
被挑出来不获得IF EXISTS
,我只是不明白为什么。
我认为原因可能是没有人认为这样的命令有用。事实上,这是一个相当危险的命令:如果数据类型支持任何类型的索引,则允许该命令
CREATE OR REPLACE TYPE
可能会破坏使用该数据类型定义的所有索引。此外,如果该数据类型已在表定义中使用,并且表不为空,CREATE OR REPLACE TYPE
则可能导致表数据损坏。仅当类型未在表或索引定义中使用时,该命令才安全。但您不妨先运行
DROP TYPE
,然后再运行CREATE TYPE
。