2016-06-21 4 views
2

У меня есть таблица, которая создается в коде ниже:автоматическое приращение не может

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 
     ); 

Кроме того у меня есть записи, импортированные из CSV файла в таблицу. Я хочу, чтобы вставить новую запись в таблицу и я получаю эту ошибку

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.

Я попытался изменить последовательность таблицы, выполнив следующий запрос.

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 

Тогда я попробовал еще раз запрос вставки, который:

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

Я все еще получаю эту ошибку! Я также заметил, что каждый раз, когда я пытаюсь выполнить запрос на вставку, дублирующее значение ключа автоматически увеличивается 3,4,5,6 и т. Д.

+1

Ваш альтер код показывает 'salesorderid' но ошибка на' salesorderdetailid' –

+0

да я сделал ошибку, теперь это правильно! – HelloIT

ответ

2

(Во-первых, извинения за не комментирование и вместо ответа - у меня нет еще нет комментариев)

Это интересная проблема. Я выполнил весь свой код на моем собственном экземпляре Sandbox PostGres и не имел проблем с вставкой каких-либо новых данных в схему.

Где я заметил проблему с этим кодового блоком

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 

В моем собственном случае имя последовательности по умолчанию является salesorderdetail_salesorderdetailid_seq по умолчанию. Если вы не изменили его явно, я предполагаю, что либо что-то в содержании вашего CSV (кажется менее вероятным), либо именование последовательности в вашем запросе выше - проблема. Интересно, что PG не возвращал ошибок, когда я пытался перезапустить эту несуществующую последовательность.

Так что - попробовать это вместо

alter sequence salesorderdetail_salesorderdetailid_seq RESTART with 75124; 
+2

Я думаю, что вы на правильном пути, но вы можете '\ d salesorderdetail' внутри' psql', чтобы узнать, какие вызовы вызывают. У CREATE SEQUENCE вещь для таблицы, у которой уже есть «последовательные» столбцы, не имеет смысла, столбцы «serial» сами создают последовательности. –

+0

@muistooshort хорошая точка, CREATE SEQUENCE является избыточным. Я не знал о трюке \ d - спасибо за это :) – hdizzle

Смежные вопросы