CHECK i vincoli non possono attualmente fare riferimento ad altre tabelle. Il manuale:
Attualmente, CHECK le espressioni non possono contenere sottoquery né fare riferimento a variabili diverse dalle colonne della riga corrente.
Un modo è usare un trigger come dimostrato da @Wolph.
Una soluzione pulita senza trigger :aggiungi colonne ridondanti e includile in FOREIGN KEY vincoli , che rappresentano la prima scelta per imporre l'integrità referenziale. Risposta correlata su dba.SE con istruzioni dettagliate:
- Applicare i vincoli "a due tavoli di distanza"
Un'altra opzione sarebbe quella di "falsificare" un IMMUTABLE funzione fare il controllo e usarlo in un CHECK vincolo. Postgres lo consentirà, ma tieni presente i possibili avvertimenti. È meglio che sia un NOT VALID vincolo. Vedi:
- Disabilita tutti i vincoli e i controlli delle tabelle durante il ripristino di un dump