O PostgreSQL tem uma OR REPLACE
variante " " (como em " CREATE OR REPLACE ____
") para tabelas, funções, visualizações, regras, etc. No entanto, ele não tem uma para tipos.
Eu poderia ir registrar um bug, mas imagino que essa foi uma decisão deliberada dos mantenedores. Minha pergunta é: por quê?
Em outras palavras, o que há de diferente nos tipos que os faz não precisar de um OR REPLACE
(mesmo que tabelas, funções, etc. precisem)?
PS Acabei de descobrir que ele tem um DROP TYPE IF EXISTS
... o que só me confunde mais. Realmente parece que CREATE TYPE
foi escolhido para não ter um IF EXISTS
, e eu simplesmente não vejo o porquê.
Acho que a razão pode ser que ninguém considerou tal comando útil. Na verdade, é um comando bastante perigoso: se o tipo de dado suporta índices de qualquer tipo, permitir
CREATE OR REPLACE TYPE
tem o potencial de corromper todos os índices definidos usando esse tipo de dado. Além disso, se o tipo de dado já for usado em uma definição de tabela, e a tabela não estiver vazia,CREATE OR REPLACE TYPE
pode levar à corrupção dos dados da tabela.O comando só seria seguro de usar se o tipo não for usado em uma definição de tabela ou índice. Mas então você pode muito bem executar
DROP TYPE
, seguido porCREATE TYPE
.