--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
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
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
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
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)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 rel_keywords_artikel; fk_artikel_id | fk_keywords_id ---------------+---------------- 1 | 1 1 | 2 1 | 3 2 | 4 2 | 5 (5 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 keywords; keywords_id | keywords -------------+---------- 1 | Heuchler 2 | Affe 3 | Hund 4 | Stadt (4 Zeilen)
Wenn ich dabei was übersehe, sag es mirCode:test=# select * from rel_keywords_artikel; fk_artikel_id | fk_keywords_id ---------------+---------------- 1 | 1 1 | 2 1 | 3 2 | 4 2 | 2 (5 Zeilen)Ich bin wie gesagt ein absolutes Greenhorn, das ist meine erste Datenbank, die ich selbst erstelle.
Danke trotzdem für deine Hilfe!
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Das stimmt, ich verhindere es mit:
Aber das führt doch dazu, dass Datensatz 2 in der Relationstabelle keinen Eintrag erhält, der Affe mit Datensatz 2 verbindet.Code:CREATE UNIQUE INDEX keywords_index ON keywords (keywords);
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)
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
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:
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.FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint »keywords_index«
********** Fehler **********
FEHLER: doppelter Schlüsselwert verletzt Unique-Constraint »keywords_index«
SQL Status:23505
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)
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:
AndreasCode: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=*#
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
oh ok, das geht dann schon etwas in die tiefen von postgresql, hatte ich nicht gedacht, dass das so kompliziert istversuche 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:
so funktioniert es nicht, vermutlich muss ich an den INSERTs Änderungen vornehmen oder?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;
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen