Hallo,
habe folgende Frage ich möchte einen INSERT in eine Tabelle machen, jedoch vorher nachschauen, od der Eintrag eventuell bereits enthalten ist.
googlen ergab folgende Abfrage:
INSERT INTO table1 (field1,field2) SELECT 'value1','value2' WHERE NOT EXISTS (SELECT field1,field2 FROM table1 WHERE field1='value1');
So nun kommt die Meldung zurück:
ERROR: duplicate key value violates unique constraint "_000000vk_pkey"
SQL Status:23505
Meine Abfrage sieht so aus:
INSERT INTO _000000vk (vk_firma1,vk_bieter,vk_name)
SELECT 'value1','value2','value3' WHERE NOT EXISTS
(SELECT vk_firma1,vk_bieter,vk_name FROM _000000vk WHERE vk_bieter = 'value2' AND vk_name = "'value3');
Wo liegt jetzt der Fehler? Habe die DB nicht selber erstellt. Muss mich jetzt rein arbeiten.
Grüße
Thomas
Welche Spalten sind denn da unique? Ich vermute entweder die erste oder alle 3. Oder?
Du prüfst nur 2 Spalten ab. Also, Tabellenaufbau anschauen und handeln ;-)Code:test=*# create table d ( d1 int, d2 int, d3 int, unique(d1,d2,d3)); NOTICE: CREATE TABLE / UNIQUE will create implicit index "d_d1_key" for table "d" CREATE TABLE test=*# insert into d (d1,d2,d3) select 1,2,3 where not exists (select d1,d2,d3 from d where (d1,d2,d3)=(1,2,3)); INSERT 0 1 test=*# insert into d (d1,d2,d3) select 1,2,3 where not exists (select d1,d2,d3 from d where (d1,d2,d3)=(1,2,3)); INSERT 0 0 test=*# select * from d; d1 | d2 | d3 ----+----+---- 1 | 2 | 3 (1 row)
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Hallo Andreas,
also von den Feldern ist keines Unique.
Es gibt das Feld vk_id dies ist PrimaryKey.
Und jeweils ein Index auf vk_bieter, vk_id
Hier mal die Tabellenstruktur aus PgAdmin:
ThomasCode:CREATE TABLE _000000vk ( vk_id serial NOT NULL, vk_bieter integer DEFAULT 0, vk_knr integer DEFAULT 0, vk_firma1 character varying(50), vk_firma2 character varying(50), vk_name character varying(50), vk_strasse character varying(50), vk_plz character varying(10), vk_ort character varying(50), vk_land character varying(5), vk_stnr character varying(50), vk_uid character varying(50), vk_sperr smallint DEFAULT 0, CONSTRAINT _000000vk_pkey PRIMARY KEY (vk_id) ) WITH (OIDS=TRUE); ALTER TABLE _000000vk OWNER TO heinze; -- Index: vk_bieter000000 -- DROP INDEX vk_bieter000000; CREATE INDEX vk_bieter000000 ON _000000vk USING btree (vk_bieter); -- Index: vk_id000000 -- DROP INDEX vk_id000000; CREATE INDEX vk_id000000 ON _000000vk USING btree (vk_id); -- Index: vk_uid000000 -- DROP INDEX vk_uid000000; CREATE INDEX vk_uid000000 ON _000000vk USING btree (vk_uid);
works for me:
Habe via Copy&Paste die Tabelle übernommen (ohne Eigentümer zu setzen) und Dein im ersten Posting gezeigtes Insert passend geändert (das sind int-Felder, ein 'value1' ist kein INT) und das " rausgemacht.Code:test=# INSERT INTO _000000vk (vk_firma1,vk_bieter,vk_name) SELECT '1','2','3' WHERE NOT EXISTS (SELECT vk_firma1,vk_bieter,vk_name FROM _000000vk WHERE vk_bieter = '2' AND vk_name = '3');INSERT 20609 1 test=*# INSERT INTO _000000vk (vk_firma1,vk_bieter,vk_name) SELECT '1','2','3' WHERE NOT EXISTS (SELECT vk_firma1,vk_bieter,vk_name FROM _000000vk WHERE vk_bieter = '2' AND vk_name = '3'); INSERT 0 0 test=*# INSERT INTO _000000vk (vk_firma1,vk_bieter,vk_name) SELECT '1','2','3' WHERE NOT EXISTS (SELECT vk_firma1,vk_bieter,vk_name FROM _000000vk WHERE vk_bieter = '2' AND vk_name = '3'); INSERT 0 0
Btw.: haue dem Erzeuger der Tabelle für das "WITH (OIDS=TRUE);" mal gepflegt in die Fresse.
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Also bei kommt immer derselbe Fehler.
Abfrage:
Ich begreife es nicht.Code:INSERT INTO _000000vk (vk_firma1,vk_bieter,vk_name) SELECT 'Test','200','Thomas' WHERE NOT EXISTS (SELECT vk_firma1,vk_bieter,vk_name FROM _000000vk WHERE vk_bieter = '200' AND vk_name='Thomas');
NEHME ALLES ZURÜCK. FUNKTIONIERT. Obwohl er nochmal 3 mal den Error ausgegeben hat.
Trotzdem Danke.
Geändert von ThoHei (19.02.2010 um 13:49 Uhr)
Wollt ich grad sagen:
Was war denn nun die Ursache für den Fehler?Code:test=# INSERT INTO _000000vk (vk_firma1,vk_bieter,vk_name) test-# SELECT 'Test','200','Thomas' WHERE NOT EXISTS test-# (SELECT vk_firma1,vk_bieter,vk_name FROM _000000vk WHERE vk_bieter = '200' AND vk_name='Thomas'); INSERT 20610 1 test=*# INSERT INTO _000000vk (vk_firma1,vk_bieter,vk_name) test-# SELECT 'Test','200','Thomas' WHERE NOT EXISTS test-# (SELECT vk_firma1,vk_bieter,vk_name FROM _000000vk WHERE vk_bieter = '200' AND vk_name='Thomas'); INSERT 0 0 test=*# INSERT INTO _000000vk (vk_firma1,vk_bieter,vk_name) test-# SELECT 'Test','200','Thomas' WHERE NOT EXISTS test-# (SELECT vk_firma1,vk_bieter,vk_name FROM _000000vk WHERE vk_bieter = '200' AND vk_name='Thomas'); INSERT 0 0 test=*#
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 habe keine Ahnung.
Ich habe die Abfrage noch 2 mal im PgAdmin und 1x in der Konsolen gemacht. Immer mit dem selben Fehler.
Danach nochmal in der Konsole und seit dem geht es. Ich kann es mir auch nicht erklären.
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen