Ergebnis 1 bis 3 von 3

Thema: Fremdschlüssel auf abgeleitete Tabelle

  1. #1
    achilles_69 ist offline Benutzer
    Registriert seit
    05.07.2006
    Ort
    Bielefeld
    Beiträge
    42

    Standard Fremdschlüssel auf abgeleitete Tabelle

    Hallo,

    ich habe von einer Tabelle mit INHERITS eine Tabelle abgeleitet. Jetzt habe ich aber Probleme mit einer Tabelle, die einen Fremdschlüssel auf die vererbende Tabelle besitzt:

    Code:
    inheritance=# CREATE TABLE test1(id SERIAL, feld1 TEXT, PRIMARY KEY(id));
    HINWEIS:  CREATE TABLE erstellt implizit eine Sequenz »test1_id_seq« für die »serial«-Spalte »test1.id«
    HINWEIS:  CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »test1_pkey« für Tabelle »test1«
    CREATE TABLE
    inheritance=# CREATE TABLE fremd (id SERIAL, test INTEGER REFERENCES test1, feld TEXT, PRIMARY KEY(id));
    HINWEIS:  CREATE TABLE erstellt implizit eine Sequenz »fremd_id_seq« für die »serial«-Spalte »fremd.id«
    HINWEIS:  CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »fremd_pkey« für Tabelle »fremd«
    CREATE TABLE
    inheritance=# CREATE TABLE test2(feld2 INTEGER) INHERITS (test1);
    CREATE TABLE
    inheritance=# INSERT INTO test1(id, feld1) VALUES (1, 'Hallo');
    INSERT 0 1
    inheritance=# INSERT INTO test2(id, feld1, feld2) VALUES (2, 'Welt', 42);
    INSERT 0 1
    inheritance=# SELECT * FROM test1;
     id | feld1 
    ----+-------
      1 | Hallo
      2 | Welt
    (2 Zeilen)
    
    inheritance=# SELECT * FROM test2;
     id | feld1 | feld2 
    ----+-------+-------
      2 | Welt  |    42
    (1 Zeile)
    
    inheritance=# INSERT INTO fremd(test, feld) VALUES (1, 'nach test1');
    INSERT 0 1
    inheritance=# INSERT INTO fremd(test, feld) VALUES (2, 'nach test2');
    FEHLER:  Einfügen oder Aktualisieren in Tabelle »fremd« verletzt Fremdschlüssel-Constraint »fremd_test_fkey«
    DETAIL:  Schlüssel (test)=(2) ist nicht in Tabelle »test1« vorhanden.
    Was mich wundert ist die Meldung, der Schlüssel (test)=(2) sei nicht in der Tabelle "test1" vorhanden.
    Der Select auf Tabelle "test1" zeigt jedoch, dass der Schlüssel sehr wohl in der Tabelle vorhanden ist.
    Wieso gibt es dennoch eine Verletzung des Constraints?

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von achilles_69 Beitrag anzeigen
    Hallo,

    ich habe von einer Tabelle mit INHERITS eine Tabelle abgeleitet. Jetzt habe ich aber Probleme mit einer Tabelle, die einen Fremdschlüssel auf die vererbende Tabelle besitzt:

    Code:
    inheritance=# CREATE TABLE test1(id SERIAL, feld1 TEXT, PRIMARY KEY(id));
    HINWEIS:  CREATE TABLE erstellt implizit eine Sequenz »test1_id_seq« für die »serial«-Spalte »test1.id«
    HINWEIS:  CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »test1_pkey« für Tabelle »test1«
    CREATE TABLE
    inheritance=# CREATE TABLE fremd (id SERIAL, test INTEGER REFERENCES test1, feld TEXT, PRIMARY KEY(id));
    HINWEIS:  CREATE TABLE erstellt implizit eine Sequenz »fremd_id_seq« für die »serial«-Spalte »fremd.id«
    HINWEIS:  CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »fremd_pkey« für Tabelle »fremd«
    CREATE TABLE
    inheritance=# CREATE TABLE test2(feld2 INTEGER) INHERITS (test1);
    CREATE TABLE
    inheritance=# INSERT INTO test1(id, feld1) VALUES (1, 'Hallo');
    INSERT 0 1
    inheritance=# INSERT INTO test2(id, feld1, feld2) VALUES (2, 'Welt', 42);
    INSERT 0 1
    inheritance=# SELECT * FROM test1;
     id | feld1 
    ----+-------
      1 | Hallo
      2 | Welt
    (2 Zeilen)
    
    inheritance=# SELECT * FROM test2;
     id | feld1 | feld2 
    ----+-------+-------
      2 | Welt  |    42
    (1 Zeile)
    
    inheritance=# INSERT INTO fremd(test, feld) VALUES (1, 'nach test1');
    INSERT 0 1
    inheritance=# INSERT INTO fremd(test, feld) VALUES (2, 'nach test2');
    FEHLER:  Einfügen oder Aktualisieren in Tabelle »fremd« verletzt Fremdschlüssel-Constraint »fremd_test_fkey«
    DETAIL:  Schlüssel (test)=(2) ist nicht in Tabelle »test1« vorhanden.
    Was mich wundert ist die Meldung, der Schlüssel (test)=(2) sei nicht in der Tabelle "test1" vorhanden.
    Der Select auf Tabelle "test1" zeigt jedoch, dass der Schlüssel sehr wohl in der Tabelle vorhanden ist.
    Wieso gibt es dennoch eine Verletzung des Constraints?
    Willkommen in der Welt der abgeleiteten (vererbten) Tabellen!

    Ein select auf die Haupttabelle zeigt Dir auch das, was in den Kind-Tabellen ist. Die Indexe allerdings gelten nur für die Tabellen, für die sie angelegt wurden. Damit auch die Constraints.


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    achilles_69 ist offline Benutzer
    Registriert seit
    05.07.2006
    Ort
    Bielefeld
    Beiträge
    42

    Standard

    Hallo,

    danke für die Antwort - dann weiß ich Bescheid.

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 23.07.2010, 15:20
  2. Antworten: 10
    Letzter Beitrag: 09.12.2009, 16:44
  3. Problem mit Fremdschlüssel
    Von progs im Forum Allgemeines
    Antworten: 2
    Letzter Beitrag: 25.09.2007, 08:53
  4. Fremdschlüssel und Vererbung
    Von beho im Forum SQL
    Antworten: 3
    Letzter Beitrag: 16.04.2007, 16:41
  5. Abfrage als Fremdschlüssel
    Von eremit im Forum Allgemeines
    Antworten: 4
    Letzter Beitrag: 20.02.2007, 10:38

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum