Ergebnis 1 bis 7 von 7

Thema: Inserets duplicate

  1. #1
    ThoHei ist offline Neuer Benutzer
    Registriert seit
    02.10.2007
    Ort
    Leipzig
    Beiträge
    15

    Standard Inserets duplicate

    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

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

    Standard

    Zitat Zitat von ThoHei Beitrag anzeigen
    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?

    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)
    Du prüfst nur 2 Spalten ab. Also, Tabellenaufbau anschauen und handeln ;-)

    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
    ThoHei ist offline Neuer Benutzer
    Registriert seit
    02.10.2007
    Ort
    Leipzig
    Beiträge
    15

    Standard

    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:
    Code:
    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);
    Thomas

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

    Standard

    Zitat Zitat von ThoHei Beitrag anzeigen
    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:
    Code:
    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);
    Thomas
    works for me:
    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
    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.

    Btw.: haue dem Erzeuger der Tabelle für das "WITH (OIDS=TRUE);" mal gepflegt in die Fresse.


    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

  5. #5
    ThoHei ist offline Neuer Benutzer
    Registriert seit
    02.10.2007
    Ort
    Leipzig
    Beiträge
    15

    Standard

    Also bei kommt immer derselbe Fehler.

    Abfrage:
    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');
    Ich begreife es nicht.

    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)

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

    Standard

    Zitat Zitat von ThoHei Beitrag anzeigen
    Also bei kommt immer derselbe Fehler.

    Abfrage:
    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');
    Ich begreife es nicht.

    NEHME ALLES ZURÜCK. FUNKTIONIERT. Obwohl er nochmal 3 mal den Error ausgegeben hat.

    Trotzdem Danke.

    Wollt ich grad sagen:

    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=*#
    Was war denn nun die Ursache für den Fehler?

    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

  7. #7
    ThoHei ist offline Neuer Benutzer
    Registriert seit
    02.10.2007
    Ort
    Leipzig
    Beiträge
    15

    Standard

    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.

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