2016-06-21 6 views
2

ich eine Tabelle, die unten in dem Code erstellt wird:Autoinkrement nicht

CREATE TABLE "salesorderdetail" (
      "salesorderid" SERIAL NOT NULL , 
      "salesorderdetailid" SERIAL PRIMARY KEY, 
      "orderqty" int NOT NULL, 
      "productid" int NOT NULL, 
      "unitprice" float NOT NULL, 
      "unitpricediscount" float NOT NULL, 
      "linetotal" float NOT NULL 
     ) WITH (
      OIDS=FALSE 
     ); 

Außerdem habe ich aus einer CSV-Datei in die Tabelle importiert Datensätze. Ich möchte einen neuen Datensatz in der Tabelle einzufügen, und ich erhalte diesen Fehler

ERROR: duplicate key value violates unique constraint "salesorderdetail_pkey" DETAIL: Key (salesorderdetailid)=(2) already exists. ********** Error **********

ERROR: duplicate key value violates unique constraint "salesorderdetail_pkey" SQL state: 23505 Detail: Key (salesorderdetailid)=(2) already exists.

Ich habe versucht, die Reihenfolge der Tabelle zu ändern, indem Sie die folgende Abfrage ausgeführt wird.

SELECT MAX("salesorderdetailid") FROM "salesorderdetail"; --Output is 75123 
CREATE SEQUENCE user_id_seq; 
ALTER SEQUENCE user_id_seq RESTART WITH 75124; --Hence I manually enter 75124 

Dann habe ich versucht, den Einsatz Abfrage erneut das ist:

INSERT INTO "salesorderdetail" (orderqty,productid,unitprice,unitpricediscount,linetotal) values (1,1,8.00,0,8.00); 

ich immer noch diesen Fehler! Ich habe auch bemerkt, dass jedes Mal, wenn ich versuche, die Einfügeabfrage auszuführen, der doppelte Schlüsselwert automatisch 3,4,5,6 usw. erhöht.

+1

Ihr alter Code zeigt 'salesorderid' aber der Fehler ist auf' salesorderdetailid' –

+0

ja ich einen Fehler gemacht jetzt ist es richtig! – HelloIT

Antwort

2

(Zuerst entschuldigen Sie sich, dass Sie nicht kommentieren und stattdessen antworten - ich habe keine genug Punkte noch zu kommentieren)

Dies ist ein interessantes Problem. Ich habe den gesamten Code auf meiner eigenen Sandbox-Instanz von PostGres ausgeführt und hatte keine Probleme beim Einfügen neuer Daten in das Schema.

Wo ich ein Problem bemerkt hat, ist mit diesem Code-Block

SELECT MAX("salesorderdetailid") FROM "salesorderdetail"; --Output is 75123 
CREATE SEQUENCE user_id_seq; 
ALTER SEQUENCE user_id_seq RESTART WITH 75124; --Hence I manually enter 75124 

In meinem eigenen Beispiel die Sequenz Standardname salesorderdetail_salesorderdetailid_seq standardmäßig ist. Sofern Sie es nicht explizit geändert haben, nehme ich an, dass entweder etwas im Inhalt Ihrer CSV (scheint weniger wahrscheinlich) oder die Benennung der Sequenz in Ihrer Abfrage oben das Problem sind. Interessanterweise gab PG keine Fehler zurück, als ich versuchte, diese nicht existierende Sequenz neu zu starten. So

- versuchen, diese stattdessen

alter sequence salesorderdetail_salesorderdetailid_seq RESTART with 75124; 
+2

Ich denke, du bist auf dem richtigen Weg, aber du könntest '' dd 'in 'psql' genau angeben, um herauszufinden, wie die Sequenzen heißen. Die CREATE SEQUENCE-Anweisung für eine Tabelle, die bereits 'serial'-Spalten hat, macht keinen Sinn,' serial'-Spalten erzeugen die Sequenzen selbst. –

+0

@muistooshort guten Punkt, CREATE SEQUENCE ist überflüssig. Ich wusste nichts über den Trick Trick - danke dafür :) – hdizzle