2014-06-23 12 views
14

Ich habe drei Tabellen: organization, organization_teams und org_users. Hier wird organization_teams von organization vererbt. Angenommen, ein Datensatz wird in organizations_teams hinzugefügt. Er erhält die organization Tabelle id als Wert für id Spalte in organization_teams.Fremdschlüssel + Tabellenvererbung in PostgreSQL?

org_users hat Fremdschlüssel auf id Spalte von organization. Nun, wenn ich versuchen, Daten in org_users einfügen es gibt mir Fehler wie unten

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" 

Warum?

+0

Nr Sequenzen Rückkehr erstellen werden nicht vererbt. – frlan

+2

Dies ist ein bekannter Vorbehalt: * Eine schwerwiegende Einschränkung der Vererbungsfunktion besteht darin, dass Indizes (einschließlich eindeutiger Integritätsregeln) und Fremdschlüsseleinschränkungen nur für einzelne Tabellen gelten, nicht für ihre Vererbung untergeordnete Objekte. * Http://www.postgresql.org/docs/ current/static/ddl-inherit.html # DDL-INHERIT-CAVEATS – pozs

+0

Ich habe bereits einige Organisationen in Organisationstabellen und einige in Organisationsteams, also haben org_user einen Fremdschlüssel für Organisationen. –

Antwort

22

Es ist covered in the user manual.

Die kurze Version: Sie können Fremdschlüssel oder Tabellenvererbung verwenden, aber nicht beide. Dies ist nicht von Natur aus unmöglich, es ist nur technisch schwierig, eindeutige Indizes zu implementieren, die vererbte Tabellen in PostgreSQL schnell und zuverlässig umfassen. Ohne das können Sie keinen nützlichen Fremdschlüssel haben. Niemand hat es erfolgreich genug implementiert, um einen Patch zu erstellen, der Unterstützung für PostgreSQL bietet.

Ein Fremdschlüssel kann auf eine Tabelle verweisen, die Teil einer Vererbungshierarchie ist, aber nur Zeilen in dieser Tabelle finden genau. Nicht in Eltern- oder Kindtabellen. Um zu sehen, welche Zeilen der Fremdschlüssel sieht, wählen Sie SELECT * FROM ONLY thetable. Das Schlüsselwort ONLY bedeutet "Ignorieren der Vererbung", und genau das wird mit der Fremdschlüssel-Suche erreicht.

+0

Wäre es "sicher", nur Fremdschlüssel an den "Leaf" -Tabellen einer Tabellenvererbungshierarchie anzuwenden? –

+0

@AndrewWolfe Wenn referenzierende und referenzierte Tabellen auf demselben Schlüssel partitioniert sind, können Sie FKs zwischen den entsprechenden Partitionen haben. Das ist alles. –

0

Die einzige Lösung die ich gefunden habe ist:

  1. Funktion Auslöser für die Überprüfung Existenz einer ID in geerbt Tabelle
  2. erstellen eine Einschränkung Trigger anstelle von FK
Verwandte Themen