2016-06-30 33 views
9

Sto creando molte migrazioni con chiavi esterne in PostgreSQL 9.4.Disabilita i controlli delle chiavi esterne PostgreSQL per le migrazioni

Questo crea un mal di testa perché le tabelle devono essere tutte nell'ordine esatto previsto dalle chiavi esterne durante la migrazione. Diventa ancora più complicato se devo eseguire migrazioni da altri pacchetti da cui dipendono le mie nuove migrazioni per una chiave esterna.

In MySQL, posso semplificare questo semplicemente aggiungendo SET FOREIGN_KEY_CHECKS = 0; nella parte superiore del mio file di migrazione. Come posso farlo temporaneamente in PostgresSQL solo per la lunghezza del codice di migrazione?

BTW, utilizzando il generatore di schemi di Laravel per questo.

risposta

18

PostgreSQL non supporta alcuna opzione di configurazione, ma esiste un'altra possibilità.

L'integrità referenziale in Postgres viene implementata dai trigger e è possibile disabilitare i trigger sulla tabella. Con questo metodo è possibile caricare qualsiasi dato (rischio), ma è significativamente più veloce - perché il controllo su grandi dati è costoso. E se il tuo caricamento è sicuro, puoi farlo.

BEGIN; 
ALTER TABLE b DISABLE TRIGGER ALL; 
-- now the RI over table b is disabled 
ALTER TABLE b ENABLE TRIGGER ALL; 
COMMIT; 

La prossima possibilità è l'utilizzo di vincoli posticipati. Questo controllo del vincolo di spostamento per il tempo di commit. Quindi non si dovrebbe rispettare ordine con INSERT comandi:

ALTER TABLE b ALTER CONSTRAINT b_id_fkey DEFERRABLE; 

BEGIN 
postgres=# SET CONSTRAINTS b_id_fkey DEFERRED; 
SET CONSTRAINTS 
postgres=# INSERT INTO b VALUES(100); -- this is not in a table 
INSERT 0 1 
postgres=# INSERT INTO b VALUES(10); 
INSERT 0 1 
postgres=# COMMIT; 
ERROR: insert or update on table "b" violates foreign key constraint "b_id_fkey" 
DETAIL: Key (id)=(100) is not present in table "a". 

Questo metodo dovrebbe essere preferito per voi, perché i dati inseriti verranno controllati.

Problemi correlati