SQL-Tabellenvererbung, die doppelte Datensätze in der Basistabelle verursacht, obwohl die Primärschlüsseleinschränkung festgelegt wurde

8

Ich habe ein Problem, bei dem ich sagen kann, dass ich eine People-Tabelle habe, die von einer Student-Tabelle und einer Teacher-Tabelle geerbt wird. wenn ich einen INSERT INTO-Schüler und einen INSERT INTO-Lehrer mache und den Primärschlüssel der Personentabelle (P_Id) zum Beispiel

vorschlage %Vor%

Ich komme mit zwei doppelten Datensätzen in meiner People-Tabelle (P_Id ist mein Primärschlüssel in der Personentabelle). Es scheint, dass die Untertabellen die Einfügungen in die Personentabelle vornehmen, ohne die Einschränkungen für diese Tabelle zu berücksichtigen. sollte die Primärschlüsseleinschränkung für die Personentabelle nicht verhindern, dass doppelte Datensätze erstellt werden?

Ich habe darüber nachgedacht, dieses Problem mit einem Trigger zu lösen, der ausgelöst wird, bevor eine Einfügung in der People-Tabelle vorgenommen wird, die nach einer P_Id sucht, die bereits existiert. aber ich möchte, dass es mich entweder daran hindert, solche Dinge zu tun, oder ich möchte, dass es nur in der Untertabelle intelligent einen Datensatz erstellt.

Nach diesem Schritt gibt es ein Problem mit der Änderung der LastName zum Beispiel in der Student-Tabelle und die Änderungen in der Lehrer-Tabelle widerspiegeln?

Hier sind die create-Anweisungen, die oben genannten Insert-Anweisungen sollten nur ein Beispiel geben. Ich verstehe, dass sie nicht mit diesen Tabellen funktionieren, die erstellt werden:

%Vor%     
SageMage 12.08.2011, 15:56
quelle

4 Antworten

4

Ich denke, dieses Verhalten ist beabsichtigt. Aus den PostgreSQL-Dokumenten . . .

  

INSERT fügt immer genau in die angegebene Tabelle ein.

Und ein wenig weiter unten auf der Seite. . .

  

Alle Überprüfungsbedingungen und Nicht-Null-Einschränkungen für eine übergeordnete Tabelle sind   automatisch von seinen Kindern geerbt. Andere Arten von Einschränkungen   (Eindeutige, Primärschlüssel- und Fremdschlüsseleinschränkungen) werden nicht vererbt.

Wenn Sie nur Personen auswählen, sehen Sie keine Zeilen. Wenn Sie nur einen Schüler auswählen, werden mehrere Zeilen mit derselben Personen-ID angezeigt. Das heißt, Sie können mehrere Zeilen mit demselben Wert für people_id in die Schüler einfügen. Dies ist bestenfalls kontraintuitiv; Die Dokumentation sagt, es ist kaputt, aber wird wahrscheinlich eines Tages behoben werden.

Aus dem Abschnitt "Vorbehalte". . .

  

Eine ernsthafte Einschränkung des Vererbungsmerkmals sind diese Indizes   (einschließlich eindeutiger Einschränkungen) und Fremdschlüsseleinschränkungen gelten nur   zu einzelnen Tabellen, nicht zu ihren Nachkommen Kindern. Dies gilt für   sowohl die referenzierenden als auch die referenzierten Seiten einer Fremdschlüsseleinschränkung.

Gleicher Abschnitt.

  

Diese Mängel werden wahrscheinlich in einer zukünftigen Version behoben werden, aber   In der Zwischenzeit ist beträchtliche Vorsicht geboten, um zu entscheiden, ob   Vererbung ist für Ihre Anwendung nützlich.

    
Mike Sherrill 'Cat Recall' 12.08.2011, 22:44
quelle
5

Die Einschränkungsregeln sind nicht vererbbar, daher müssen Sie die Einschränkung in jeder Tabelle definieren. Zum Beispiel:

%Vor%

Wir sehen uns.

    
Marco Paulo Ollivier 04.12.2013 16:19
quelle
1

Ist Ihr Primärschlüsselfeld Identity? die Einzigartigkeit einschränken?

    
Paul 12.08.2011 16:04
quelle
0

Sie fügen niemals zuerst in die untergeordneten Tabellen ein! Die Personentabelle ist die erste Tabelle, in die Sie einfügen sollten.

    
HLGEM 12.08.2011 17:04
quelle