Domanda Chiavi esterne + ereditarietà di tabelle in PostgreSQL?


Ho tre tavoli: organization, organization_teams e org_users. Qui organization_teams è ereditato da organization. Supponiamo quindi di aggiungere un record organizations_teams otterrà il organization tavolo id come valore per id colonna in organization_teams.

org_users ha la chiave straniera id colonna di organization. Ora quando provo a inserire i dati in org_users mi dà errore come di seguito

insert or update on table "org_users" violates foreign key constraint "org_users_organizations"
DETAIL:  Key (org_id)=(12) is not present in table "organizations"

Perché?


16
2018-06-23 07:12


origine


risposte:


Suo coperto nel manuale dell'utente.

La versione breve: puoi utilizzare chiavi esterne o ereditarietà di tabelle, ma non entrambe. Questo non è intrinsecamente impossibile, è solo che è tecnicamente abbastanza difficile implementare indici unici che abbracciano tabelle ereditate in PostgreSQL in modo rapido e affidabile. Senza quello, non puoi avere una chiave straniera utile. Nessuno lo ha implementato con successo abbastanza bene perché una patch che aggiunge supporto possa essere accettata in PostgreSQL.

Una chiave esterna può puntare a una tabella che fa parte di una gerarchia di ereditarietà, ma troverà solo le righe in quella tabella Esattamente. Non in qualsiasi tabella genitore o figlio. Per vedere quali righe vede la chiave esterna, fai a SELECT * FROM ONLY thetable. Il ONLY keyword significa "ignorare l'ereditarietà" ed è quello che farà la ricerca della chiave esterna.


23
2018-06-23 08:44



L'unica soluzione che ho trovato è:

  1. creare la funzione che restituisce il trigger per verificare l'esistenza di qualche id nella tabella ereditata
  2. crea un trigger di vincolo invece di FK

0
2018-06-07 21:09