Per ripristinare l'integrità referenziale nel database AlloyDB per PostgreSQL dopo la ricostruzione di un indice o l'importazione di dati, puoi eseguire una query SQL diagnostica per identificare le colonne di chiave esterna che fanno riferimento a chiavi primarie mancanti, quindi eliminare o aggiornare le righe orfane.
Per verificare la presenza di una chiave esterna in cui manca la chiave primaria corrispondente, esegui il seguente comando:
Esempio di codice
WITH q AS ( SELECT conrelid::regclass AS fk_table, confrelid::regclass AS pk_table, format('(%s)',(select string_agg(format('fk.%I', attname), ', ') FROM pg_attribute a JOIN unnest(conkey) ia(nr) ON ia.nr = a.attnum WHERE attrelid = conrelid)) AS fk_fields, format('(%s)',(select string_agg(format('pk.%I', attname), ', ') FROM pg_attribute a JOIN unnest(confkey) ia(nr) ON ia.nr = a.attnum WHERE attrelid = confrelid)) AS pk_fields, pg_get_constraintdef(oid) FROM pg_constraint WHERE contype='f' ) SELECT format( $sql$ DO $$ BEGIN RAISE NOTICE 'checking Foreign Key %3$s%1$s ==> %4$s%2$s'; END;$$; SELECT %1$s, %2$s FROM %3$s AS fk LEFT JOIN %4$s AS pk ON %1$s = %2$s WHERE %2$s IS NULL AND %1$s IS NOT NULL /* any NULL on FK side bypasses FK constraint by design */ /* use limit for testing, or detecting that there is a problem in this table */ -- LIMIT 10 $sql$, fk_fields, pk_fields, fk_table, pk_table ) FROM q \gexec
L'output dello script è simile al seguente. Se non viene visualizzato alcun output, non ci sono violazioni e l'indice è stato ricreato.
Output
id | pk_id ----+------- | 4 (1 row)
Nell'output precedente, la prima colonna mostra le colonne di chiave primaria, in questo esempio una colonna denominata id. La seconda colonna è la colonna di riferimento per la chiave esterna. Ciò significa che esiste una riga, pk_id=4, per la quale non esiste una chiave primaria principale. Puoi decidere se queste chiavi sono valide e, in caso contrario, puoi eliminarle.