Actualizar colunas referenciadas em Postgres
-
04-07-2019 - |
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.
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>'