Gostaria de adicionar uma restrição exclusiva a um campo de banco de dados em um dos meus bancos de dados de produção. Infelizmente, a seguinte declaração está bloqueando:
ALTER TABLE package ADD CONSTRAINT unique_package_id UNIQUE (package_id);
Lendo a parte relevante do manual do PostgreSQL :
Observação: adicionar uma restrição usando um índice existente pode ser útil em situações em que uma nova restrição precisa ser adicionada sem bloquear as atualizações da tabela por muito tempo. Para fazer isso, crie o índice usando CREATE INDEX CONCURRENTLY e instale-o como uma restrição oficial usando esta sintaxe. Veja o exemplo abaixo.
Eu tentei:
CREATE UNIQUE INDEX CONCURRENTLY package_tmp_id_idx ON answer (package_id);
Seguido por:
prod_db=> ALTER TABLE package ADD CONSTRAINT
unique_package_id UNIQUE (package) USING INDEX package_tmp_id_idx;
Que falhou com:
ERROR: syntax error at or near "package_tmp_id_idx"
LINE 1: ...T unique_package_id UNIQUE (answer_id) USING INDEX package_tmp_id_idx...
^
Tentei brincar com a sintaxe, mas não consegui fazê-la funcionar.
Qual é a sintaxe correta para criar uma restrição UNIQUE usando um índice UNIQUE existente?
Você não especifica a coluna para a restrição exclusiva. Isso não é necessário porque a lista de colunas é definida por meio do índice:
Há um exemplo disso no manual:
http://www.postgresql.org/docs/current/static/sql-altertable.html
Você precisa rolar para baixo até o final da página