Domanda

Quando ci sono una o più colonne che fanno riferimento a un'altra, sto cercando il modo migliore per aggiornare quella colonna mantenendo l'integrità referenziale. Ad esempio, se ho una tabella di etichette e descrizioni e due voci:

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

Ora, non voglio questi duplicati. Voglio aggiungere un vincolo alla colonna che non consente valori duplicati senza distinzione tra maiuscole e minuscole, come nell'esempio. Tuttavia, ho diverse righe di diverse altre tabelle che fanno riferimento a "LEGGI", quella che voglio eliminare.

So che Postgres sa quali campi di altre righe fanno riferimento a questo, perché non posso eliminarlo finché sono lì. Quindi, come posso ottenere qualsiasi campo che fa riferimento a questo per aggiornare a "leggere"? Questo è solo un esempio e in realtà ho alcuni posti in cui voglio farlo. Un altro esempio è in realtà una chiave primaria int per alcune tabelle, in cui desidero aggiungere una nuova tabella come una sorta di "tabella di base" che quelli esistenti estendono e quindi dovranno ora avere tutti gli ID univoci, il che significa che l'aggiornamento quelli che hanno.

Sono aperto a ricette per funzioni che posso aggiungere per fare questo, strumenti che posso usare o qualsiasi altra cosa.

È stato utile?

Soluzione

Se hai molte righe che fanno riferimento a READ, puoi modificare la chiave esterna per l'aggiornamento a cascata, aggiornare il set di tabelle Label = 'read' dove Label = 'READ' e tutto verrà riparato automagicamente. Dopodiché puoi modificare nuovamente il vincolo per essere come prima.

Per trovare tutte le tabelle che fanno riferimento alla colonna, puoi usare

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>'

Altri suggerimenti

Per il futuro potresti creare un indice univoco sulla colonna " label " ;, ad esempio:

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

Oppure consulta il manuale . Ciò ti aiuterebbe a evitare questa situazione per la prossima volta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top