Дубликат идентификатора таблицы Postgres, когда существует уникальное ограничение первичного ключа

Вопрос в журнале

  1. вопрос возникает в компоненте jpa данных spring. есть лог говорят:
Caused by: org.hibernate.HibernateException: More than one row with the given identifier was found: a9d3e53c-efe2-4945-a034-f2d045fe6cce, for class: com.***.model.User

И я просматриваю свою базу данных, нахожу повторяющиеся данные. что случилось? почему существуют два пользователя с одинаковым идентификатором?

Схема таблицы

---------------------+--------------------------+-----------+----------+---------
 id                  | uuid                     |           | not null |
 blocked             | boolean                  |           | not null |
 is_admin            | boolean                  |           |          |
 is_root             | boolean                  |           |          |
 last_login_at       | timestamp with time zone |           |          |
 nick_name           | text                     |           |          |
 pass_word           | character varying(255)   |           |          |
 register_at         | timestamp with time zone |           |          |
 user_name           | character varying(255)   |           |          |
 app_image           | text                     |           |          |
 avatar              | text                     |           |          |
 birth_day           | text                     |           |          |
 city                | text                     |           |          |
 front_blocked       | boolean                  |           |          |
 gender              | smallint                 |           |          |
 intro               | text                     |           |          |
 is_vest             | boolean                  |           |          |
 phone               | text                     |           |          |
 web_image           | text                     |           |          |
 wrap_vest           | boolean                  |           |          |
 wx_mini_app_open_id | text                     |           |          |
 wx_open_id          | text                     |           |          |
 wx_union_id         | text                     |           |          |
Indexes:
    "user_pkey" PRIMARY KEY, btree (id)
    "uk_589idila9li6a4arw1t8ht1gx" UNIQUE CONSTRAINT, btree (phone)
    "uk__user__phone" UNIQUE CONSTRAINT, btree (phone)
    "uk__user__wx_union_id" UNIQUE CONSTRAINT, btree (wx_union_id)
    "uk_lqjrcobrh9jc8wpcar64q1bfh" UNIQUE CONSTRAINT, btree (user_name)
Referenced by:
    TABLE "role" CONSTRAINT "fkahi3iro2tsdvjif5c499jg8rv" FOREIGN KEY (created_by_id) REFERENCES "user"(id)
    TABLE "role_users" CONSTRAINT "fkarktlgi8f51hau76pfku4noat" FOREIGN KEY (user_id) REFERENCES "user"(id)
    TABLE "exception" CONSTRAINT "fkkd502yhn3ji8bqecwd4yax0gk" FOREIGN KEY (user_id) REFERENCES "user"(id)
    TABLE "version_management" CONSTRAINT "fktd43egsseixxvg2j59irwunid" FOREIGN KEY (created_by_id) REFERENCES "user"(id)

Групповой результат

=# select id, count(*) from "user" group by id;
                  id                  | count
--------------------------------------+-------
 062e8528-0b6c-465c-b883-ac513ad41442 |     1
 122881d5-9d28-49b9-b488-61575e41b4e7 |     1
 f3603aa6-76bc-431f-81a4-e06d4c0bfad2 |     1
 93102a40-a82f-4e6e-8a7a-ecbf9f9c2b29 |     1
 2b5d9bd7-222d-4e44-9897-159726c533c0 |     1
 bf91105d-bbfc-4dbe-93d6-b580e13100b8 |     1
 f7a6c129-5df1-41e8-8847-99c553a701fa |     1
 a9d3e53c-efe2-4945-a034-f2d045fe6cce |     2
 507873de-fc12-4bd1-bf93-a2ded7ac8d88 |     1
 29646dd8-ffc7-4fff-a708-e3f3bef64b28 |     1

Разве первичный ключ не должен определяться таким образом - "id" PRIMARY KEY, btree (id)?

Mubaraka Bharucha 15.12.2020 14:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны столкнуться с повреждением данных.

Вам придется сделать дамп базы данных и восстановить ее во вновь созданный кластер PostgreSQL, а также удалить дубликаты вручную.

Тогда вам лучше выяснить, что могло вызвать проблему. Были ли недавние аварии? Аппаратное обеспечение (диск, память) в порядке? Вы восстанавливали из резервной копии или активировали резервный сервер? Также может быть полезно найти последнюю резервную копию, в которой нет поврежденных данных, и повторить, что вы изменили с тех пор.

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

bingege 16.12.2020 02:10

Другие вопросы по теме