Actualizar colunas referenciadas em Postgres

votos
0

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 referenciamento 'ler', o que eu quero largar.

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 referência a este para atualizar a '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 precisa ter IDs exclusivos agora, o que significa que a actualização aqueles que têm.

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

Publicado 26/10/2008 em 19:10
fonte usuário
Em outras línguas...                            


2 respostas

votos
1

Se você tem muitas linhas que fazem referência ler, você poderia alterar a chave estrangeira para ser na atualização cascata, atualizar esse rótulo 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>'
Respondeu 26/10/2008 em 19:18
fonte usuário

votos
0

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

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

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

Respondeu 26/10/2008 em 22:38
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more