Pergunta

Quando há uma ou mais colunas que fazem referência a outra, eu estou lutando para a melhor maneira de atualizar essa coluna, mantendo a integridade referencial. Por exemplo, se eu tiver uma tabela de rótulos e descrições e duas entradas:

Label | Description
------------------------------------
read  | This item has been read
READ  | You read this thing already

Agora, eu não quero essas duplicatas. Eu quero adicionar uma restrição para a coluna que não permite valores que são duplicatas de caso-insensível, como no exemplo. No entanto, tenho várias linhas de várias outras mesas que fazem referência 'ler', o que eu quero cair.

Eu sei Postgres sabe quais campos de outras linhas estão fazendo referência isso, porque eu não posso apagá-lo, enquanto eles estão lá. Então, como eu poderia conseguir qualquer campo referenciando esta a atualização de 'ler'? Este é apenas um exemplo, e eu realmente tenho alguns lugares que eu quero fazer isso. Outro exemplo é na verdade uma chave primária int para algumas mesas, onde eu quero adicionar uma nova tabela como uma espécie de 'tabela de base' que os já existentes estender e assim todos eles necessidade de ter IDs exclusivos agora, o que significa que a actualização aqueles que têm.

Estou aberto a receitas para funções que posso acrescentar para fazer isso, ferramentas que pode utilizar, ou qualquer outra coisa.

Foi útil?

Solução

Se você tem muitas linhas que fazem referência ler, você poderia alterar a chave estrangeira para ser na atualização cascata, atualização que etiqueta set table = 'ler', onde Label = 'ler' e tudo vai ficar automagicamente fixo. Depois disso, você pode alterar a restrição de novo a ser como era antes.

Para encontrar todas as tabelas que fazem referência a coluna, você pode usar

select TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME,
REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME from 
INFORMATION_SCHEMA.KEY_COLUMN_USAGE where
REFERENCED_TABLE_NAME = '<table>' AND REFERENCED_COLUMN_NAME = '<column>'

Outras dicas

Para o futuro você pode criar um índice exclusivo sobre o "rótulo" de coluna, por exemplo:

CREATE UNIQUE INDEX index_name ON table ((lower(label)));

Ou verificar o manual. Isso iria ajudá-lo a evitar esta situação para a próxima vez.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top