Seite 3 von 5 ErsteErste 12345 LetzteLetzte
Ergebnis 21 bis 30 von 45

Thema: Datenbankprojekt

  1. #21
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von flhe Beitrag anzeigen

    Affe käme zum zweiten Mal vor und hätte unterschiedliche IDs. Um das zu verhindern muss ich ja überprüfen, ob der Wert schon in der Tabelle keyword vorhanden ist. Dazu muss ich doch aber den currval() überprüfen, den ich gerade eintrage?

    Wie sähe das in meinem konkreten Beispiel aus?

    Danke! Gruß
    Du legtst einen unique Index auf die Spalte, in der 'Affe' steht.

    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

  2. #22
    andetsa ist offline Neuer Benutzer
    Registriert seit
    21.02.2010
    Beiträge
    18

    Standard

    Ok, das führt jedoch nur dazu, dass ein gleicher Eintrag verhindert wird, nicht aber, dass der doppelte Eintrag die gleiche ID bekommt wie der schon vorhandene.

    FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint »keywords_index«


    ********** Fehler **********

    FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint »keywords_index«
    SQL Status:23505

  3. #23
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von andetsa Beitrag anzeigen
    Ok, das führt jedoch nur dazu, dass ein gleicher Eintrag verhindert wird, nicht aber, dass der doppelte Eintrag die gleiche ID bekommt wie der schon vorhandene.
    Parse error. Wenn die ID-Spalte einen unique Index hat, dann gibt es da keine gleichen Einträge.

    Vielleicht willst Du den Fehler aber nicht entstehen lassen, dann sei Dir Avoid Unique Key violation - ads' corner empfohlen.

    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

  4. #24
    andetsa ist offline Neuer Benutzer
    Registriert seit
    21.02.2010
    Beiträge
    18

    Standard

    Ich glaube wir reden irgendwie aneinander vorbei. Was ich verhindern will ist folgendes Szenario:

    Code:
    test=# select * from keywords;
    keywords_id | keywords
    -------------+----------
               1 | Heuchler
               2 | Affe
               3 | Hund
               4 | Stadt
               5 | Affe
    (5 Zeilen)
    Code:
    test=# select * from rel_keywords_artikel;
     fk_artikel_id | fk_keywords_id
    ---------------+----------------
                 1 |              1
                 1 |              2
                 1 |              3
                 2 |              4
                 2 |              5
    (5 Zeilen)
    Affe hat 2 verschiedene IDs. Ist ja auch klar, da Affe ein Stichwort ist, dass in mehreren Datensätzen vorkommt. D.h. das ganze sollte so aussehen:

    Code:
    test=# select * from keywords;
    keywords_id | keywords
    -------------+----------
               1 | Heuchler
               2 | Affe
               3 | Hund
               4 | Stadt
    (4 Zeilen)
    Jedoch sollte in der Relationstabelle eine Referenz hinterlegt werden, nämlich dass Datensatz 2 die keyword_id 2 enthält.

    Code:
    test=# select * from rel_keywords_artikel;
     fk_artikel_id | fk_keywords_id
    ---------------+----------------
                 1 |              1
                 1 |              2
                 1 |              3
                 2 |              4
                 2 |              2
    (5 Zeilen)
    Wenn ich dabei was übersehe, sag es mir Ich bin wie gesagt ein absolutes Greenhorn, das ist meine erste Datenbank, die ich selbst erstelle.

    Danke trotzdem für deine Hilfe!

  5. #25
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von andetsa Beitrag anzeigen
    Ich glaube wir reden irgendwie aneinander vorbei. Was ich verhindern will ist folgendes Szenario:

    Code:
    test=# select * from keywords;
    keywords_id | keywords
    -------------+----------
               1 | Heuchler
               2 | Affe
               3 | Hund
               4 | Stadt
               5 | Affe
    (5 Zeilen)
    Exakt das ist das Problem, und verhindern kannst Du das mit einem UNIQUE INDEX auf der Tabelle, Spalte keywords.

    Oder aber ich versteh Dein Problem wirklich nicht, was durchaus möglich sein kann ...

    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

  6. #26
    andetsa ist offline Neuer Benutzer
    Registriert seit
    21.02.2010
    Beiträge
    18

    Standard

    Das stimmt, ich verhindere es mit:

    Code:
    CREATE UNIQUE INDEX keywords_index ON keywords (keywords);
    Aber das führt doch dazu, dass Datensatz 2 in der Relationstabelle keinen Eintrag erhält, der Affe mit Datensatz 2 verbindet.

    Siehe hier, die letzte Zeile fehlt dann:

    Code:
    test=# select * from rel_keywords_artikel;
     fk_artikel_id | fk_keywords_id
    ---------------+----------------
                 1 |              1
                 1 |              2
                 1 |              3
                 2 |              4
    (4 Zeilen)

  7. #27
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von andetsa Beitrag anzeigen
    Das stimmt, ich verhindere es mit:

    Code:
    CREATE UNIQUE INDEX keywords_index ON keywords (keywords);
    Aber das führt doch dazu, dass Datensatz 2 in der Relationstabelle keinen Eintrag erhält, der Affe mit Datensatz 2 verbindet.

    Siehe hier, die letzte Zeile fehlt dann:

    Code:
    test=# select * from rel_keywords_artikel;
     fk_artikel_id | fk_keywords_id
    ---------------+----------------
                 1 |              1
                 1 |              2
                 1 |              3
                 2 |              4
    (4 Zeilen)
    Affe gibt es doch deswegen noch immer, nur mit ID 2. Diese verwendest Du, und nicht die 5.

    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

  8. #28
    andetsa ist offline Neuer Benutzer
    Registriert seit
    21.02.2010
    Beiträge
    18

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    Affe gibt es doch deswegen noch immer, nur mit ID 2. Diese verwendest Du, und nicht die 5.

    Andreas
    Das ist mir absolut klar, nur postgres scheinbar nicht. Denn wenn ich Datensatz 2 einfügen möchte kommt zunächst mal die bekannte Fehlermeldung:

    FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint »keywords_index«


    ********** Fehler **********

    FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint »keywords_index«
    SQL Status:23505
    Das bringt mir nur recht wenig. Was ich erwarte ist doch, dass postgres merkt OK hier kommt Affe doppelt vor, also schaue ich welche ID hat denn Affe? OK Affe hat die ID 2 also verknüpfe Datensatz 2 mit der keyword_id 2.

    Code:
    test=# select * from rel_keywords_artikel;
     fk_artikel_id | fk_keywords_id
    ---------------+----------------
                 1 |              1
                 1 |              2
                 1 |              3
                 2 |              4
                 2 |              2
    (5 Zeilen)

  9. #29
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von andetsa Beitrag anzeigen
    Das ist mir absolut klar, nur postgres scheinbar nicht.
    Du wirst es ihm klarmachen müssen. Ich zeigte ja schon den Link zum Blog von ads. Hier mal ein Schnellschuß, wie man das in eine Funktion kapselt, die Du zum Einfügen nutzen kannst, sie liefert die ID eines entweder neuen und damit eingefügten oder eines schon vorhandenen Datensatzes:

    Code:
    test=*# CREATE TABLE uk_test (id SERIAL, col1 VARCHAR(20) NOT NULL UNIQUE);
    NOTICE:  CREATE TABLE will create implicit sequence "uk_test_id_seq" for serial column "uk_test.id"
    NOTICE:  CREATE TABLE / UNIQUE will create implicit index "uk_test_col1_key" for table "uk_test"
    CREATE TABLE
    test=*# create or replace function insert_uk(in value text) returns int as $$declare ret int; begin INSERT INTO uk_test (col1) SELECT $1 WHERE NOT EXISTS (SELECT col1 FROM uk_test WHERE col1=$1);  select into ret id from uk_test where col1=$1; return ret; end;$$ language plpgsql;
    CREATE FUNCTION
    test=*# select * from insert_uk('Affe');
     insert_uk
    -----------
             1
    (1 row)
    
    test=*# select * from insert_uk('Affe');
     insert_uk
    -----------
             1
    (1 row)
    
    test=*# select * from insert_uk('Biene');
     insert_uk
    -----------
             2
    (1 row)
    
    test=*# select * from insert_uk('Affe');
     insert_uk
    -----------
             1
    (1 row)
    
    test=*# select * from insert_uk('Kamel');
     insert_uk
    -----------
             3
    (1 row)
    
    test=*# select * from insert_uk('Biene');
     insert_uk
    -----------
             2
    (1 row)
    
    test=*#
    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

  10. #30
    andetsa ist offline Neuer Benutzer
    Registriert seit
    21.02.2010
    Beiträge
    18

    Standard

    oh ok, das geht dann schon etwas in die tiefen von postgresql, hatte ich nicht gedacht, dass das so kompliziert ist versuche die funktion gerade mithilfe der doku so weit wie möglich zu verstehen. aber wie ich sie nun auf meine keywords tabelle anwende, habe ich nicht herausgefunden, außer einer 1 zu 1 Adaptation:

    Code:
    create or replace function keywords_check(in value text) returns int as $$declare ret int; begin INSERT INTO keywords (keywords) SELECT $1 WHERE NOT EXISTS (SELECT keywords FROM keywords WHERE col1=$1);  select into ret id from keywords where col1=$1; return ret; end;$$ language plpgsql;
    so funktioniert es nicht, vermutlich muss ich an den INSERTs Änderungen vornehmen oder?

Seite 3 von 5 ErsteErste 12345 LetzteLetzte

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