Ошибка 23505 повторяющееся значение ключа нарушает ограничение уникальности

i new in postgresql and when i test my code for insert, i get following error message

error exception(‘ERROR’, ‘23505’, ‘duplicate key value violates unique constraint «foo_column_key»‘);

i had tried use connection.commit() or connection.rollback() right after cursor.execute() code.

question:

how i can fix this error without re-create table like command «select setval(‘foo_id_seq’, 1)»? before i try used «reindex table foo;» from postgres but not work and run commit or rollback from psql not work too(maybe difference connection id). also search google for reset all transaction data or use search key my title above, but not find any solution.

anyone can help me or show me the direction to solve this?

thank you.

EDIT:

sorry, maybe this give clearly my question:

create table foo(
  foo_id serial unique not null primary key,
  foo_column character(35) unique not null
);

I insert data with this sql command from my programming code:

insert into foo(foo_column) values('my_email@test.com');

at first I check data in table by «select * from foo;», but there is no data insert. again i re-run code by refresh page(cgi application) and i got that message, and then i check again in table by select * from foo; but nothing inserted. this is my first time use insert that is transaction, before i use mysql with no transaction at all.

I tried to find solution but always found the solution is for column serial/bigserial primary key and i curious so i ask here. is there any method for solve this error without re-create table?

hope this give you more clearly about my question and thanks.

Добрый день!
Очень странная ошибка вылезает исключительно при первом сохранении

SQLSTATE[23505]: Unique violation: 7 ОШИБКА: повторяющееся значение ключа нарушает ограничение уникальности "category_pkey" DETAIL: Ключ "(id)=(1)" уже существует. The SQL being executed was: INSERT INTO "module_category" ("name", "slug", "sort_order", "status", "created_at", "updated_at", "lft", "rgt", "depth") VALUES ('Пылесосы', 'pylesosy', 1, FALSE, 1531748095, 1531748095, 2, 3, 1) RETURNING "id"

Очень странные дела, он как будто пытается insert категорию, которая находится в _node

Сохранение происходит как написано в мануале:

$parent = Category::findOne($this->parent_id);
// ...
$category->appendTo($parent);
$category->save();

Ошибка возникает именно при самом первом сохранении после миграции.
PS: в миграции идет вставка «root» категории
PSS: https://monosnap.com/file/qHElE2SvMh2GCYsvrPUYNDjrA74U6t

в БД вставлены начальные данные

вставлены как? Ну, я и так знаю, что id вы сами при этом какие-то выбрали и использовали. В частности, использовали 1 вместо механизма IDENTITY, что особенно важно, объявленного именно как GENERATED BY DEFAULT.

melkij=> create temp table foo (
  id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY (
     INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1
  ) , val int);
CREATE TABLE
melkij=> insert into foo (id, val) values(1,1);
INSERT 0 1
melkij=> insert into foo (val) values(2);
INSERT 0 1
melkij=> table foo;
 id | val 
----+-----
  1 |   1
  1 |   2
(2 строки)

Иначе говоря — а кто будет сообщать этому sequence о том, что какие-то значения вы присвоили самостоятельно? Никто. Вы (вернее ваш фреймворк) попросили BY DEFAULT, именно это поведение и получили, новое значение последовательности генерируется только если при добавлении строки не было указано явное значение.

Вам нужно изменить значение следующего генерируемого значения:

select max(id)+1 from tsdb."user";
ALTER TABLE tsdb."user" ALTER COLUMN id RESTART WITH /* результат предыдущего запроса */;

Если бы вы попросили GENERATED ALWAYS AS IDENTITY — то получили бы любезную ошибку при попытке делать странное:

melkij=> create temp table foo (id bigint NOT NULL GENERATED always AS IDENTITY ( 
    INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1) , val int);
CREATE TABLE
melkij=> insert into foo (id, val) values(1,1);
ERROR:  cannot insert into column "id"
ПОДРОБНОСТИ:  Column "id" is an identity column defined as GENERATED ALWAYS.
ПОДСКАЗКА:  Use OVERRIDING SYSTEM VALUE to override.

А GENERATED BY DEFAULT и должен себя ввести так как ведёт.

#postgresql

#postgresql

Вопрос:

я новичок в postgresql, и когда я тестирую свой код на вставку, я получаю следующее сообщение об ошибке

исключение ошибки (‘ОШИБКА’, ‘23505’, ‘повторяющееся значение ключа нарушает уникальное ограничение «foo_column_key»‘);

я пытался использовать connection.commit () или connection.rollback () сразу после кода cursor.execute ().

вопрос:

как я могу исправить эту ошибку без повторного создания таблицы, например, команды «select setval (‘foo_id_seq’, 1)»? прежде чем я попробовал использовать «переиндексацию таблицы foo;» из postgres, но не работает, и выполнить фиксацию или откат из psql тоже не работает (возможно, разница в идентификаторе соединения). также выполните поиск в Google для сброса всех данных транзакции или используйте поисковый ключ my title выше, но не нашли никакого решения.

кто-нибудь может мне помочь или показать мне направление для решения этой проблемы?

Спасибо.

Редактировать:

извините, может быть, это четко сформулирует мой вопрос:

 create table foo(
  foo_id serial unique not null primary key,
  foo_column character(35) unique not null
);
  

Я вставляю данные с помощью этой команды sql из своего программного кода:

 insert into foo(foo_column) values('my_email@test.com');
  

сначала я проверяю данные в таблице с помощью «select * from foo;», но вставка данных отсутствует. снова я повторно запускаю код на странице обновления (приложение cgi), и я получил это сообщение, а затем снова проверяю в таблице by select * from foo; , но ничего не вставлено. я впервые использую вставку, которая является транзакцией, прежде чем использовать mysql вообще без транзакции.

Я пытался найти решение, но всегда находил, что решение предназначено для столбца serial / bigserial primary key, и мне любопытно, поэтому я спрашиваю здесь. есть ли какой-либо способ устранить эту ошибку без повторного создания таблицы?

надеюсь, это даст вам более четкое представление о моем вопросе и спасибо.

Ответ №1:

Очевидно, что из сообщения вы пытаетесь вставить значение в столбец, который там уже существует. Если у вас есть секвенсор в поле (например, с последовательным типом столбца), он, вероятно, не синхронизирован с таблицей, потому что вы выполнили вставку и указали значение (вместо того, чтобы позволить механизму «по умолчанию» обработать его, получив nextval из секвенсора). Если это так, сбросьте секвенсор с помощью оператора setval на максимальное значение поля (google, как это сделать — много сообщений на эту тему). Или просто продолжайте пытаться делать вставки, пока один из них не сработает волшебным образом! 😉

Комментарии:

1. ИЗМЕНИТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ после ПЕРЕЗАПУСКА С ПОМОЩЬЮ (ВЫБРАТЬ (max (id) 1) ИЗ таблицы);

2. Соответствующие документы: ИЗМЕНИТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ , макс (идентификатор)

я new в postgresql, и когда я тестирую свой код для вставки, я получаю следующее сообщение об ошибке

исключение ошибки (‘ERROR’, ‘23505’, ‘дублирующее значение ключа нарушает уникальное ограничение «foo_column_key»‘);

Я попытался использовать connection.commit() или connection.rollback() сразу после кода cursor.execute().

вопрос:

как я могу исправить эту ошибку без повторного создания таблицы, как команда «select setval (‘foo_id_seq’, 1)»? прежде чем я попробую использовать «reindex table foo;» из postgres, но не работает, и запустить commit или rollback из psql тоже не работает (может быть, идентификатор разницы соединений). также выполните поиск google для сброса всех данных транзакции или используйте ключ поиска, мой заголовок выше, но не найти никакого решения.

кто-нибудь может помочь мне или показать мне направление для решения этого?

Спасибо.

РЕДАКТИРОВАТЬ:

извините, может быть, это ясно дает мой вопрос:

create table foo(
foo_id serial unique not null primary key,
foo_column character(35) unique not null
);

Я вставляю данные с этой командой sql из моего кода программирования:

insert into foo(foo_column) values('my_email@test.com');

сначала я проверяю данные в таблице на «select * from foo;», но нет вставки данных. снова я заново запускаю код на странице обновления (приложение cgi), и я получил это сообщение, а затем снова проверю таблицу, select * from foo; но ничего не вставлено. это моя первая вставка использования, которая является транзакцией, прежде чем я буду использовать mysql без транзакции вообще.

Я попытался найти решение, но всегда нашел решение для первичного ключа serial/bigserial, и мне интересно, поэтому я спрашиваю здесь. есть ли какой-либо метод для решения этой ошибки без повторной создания таблицы?

надеюсь, это даст вам более четкое представление о моем вопросе и благодарности.

Понравилась статья? Поделить с друзьями:
  • Ошибка 23505 duplicate key value violates unique constraint
  • Ошибка 2350 при установке офиса
  • Ошибка 2350 fdi server error
  • Ошибка 235 эвотор как устранить онлайн касса
  • Ошибка 235 термокинг т 800