1

Temat: duplicate key violates unique constraint - jak znaleźć winowajcę

Witam,

mam taki błąd:
ERROR:  duplicate key violates unique constraint "measurement_data_id_time_pk"

Z tego wynika, że chyba gdzieś jest jest 2 razy taki sam primary kluczyk w kolumnie measurement_data_id_time_pk
W celach leczniczych odpaliłem reindex database. Zrobił. Lecz błędu nie naprawił.
Chciałem jeszcze zrobić vacuum verbose lecz skończyły mi się sloty:
NOTICE:  number of page slots needed (30992) exceeds max_fsm_pages (20000)
PODPOWIEDŹ:  Consider increasing the configuration parameter "max_fsm_pages" to a value over 30992.

W końcu się napaliłem, że może jakoś ręcznie SQLem wytnę ten dodatkowy wadliwy wpis. Tylko jak tą kolumnę odnaleźć w bazie i jak wyśledzić który wiersz jest podwójny.

1. Czy ktoś mógłby mi powiedzieć jak to naprawić (może jest lepsza metoda niż moje kombinacje)?
2. Jeśli jednak nie ma takiej metody to jak wyśledzić wadliwy wiersz w całej bazie (nie znam układu tej bazy)?

2

Odp: duplicate key violates unique constraint - jak znaleźć winowajcę

3

Odp: duplicate key violates unique constraint - jak znaleźć winowajcę

4

Odp: duplicate key violates unique constraint - jak znaleźć winowajcę

--
-- Name: measurement_data_id_time_pk; Type: CONSTRAINT; Schema: public; Owner: hqadmin; Tablespace: 
--

ALTER TABLE ONLY eam_measurement_data
    ADD CONSTRAINT measurement_data_id_time_pk PRIMARY KEY (measurement_id, "timestamp");

5

Odp: duplicate key violates unique constraint - jak znaleźć winowajcę

select measurement_id, timestamp, count(*) from eam_measurement_data
group by  measurement_id, timestamp having count(*)>1

6

Odp: duplicate key violates unique constraint - jak znaleźć winowajcę

select measurement_id, timestamp, count(*) from eam_measurement_data
group by  measurement_id, timestamp having count(*)>1

7

Odp: duplicate key violates unique constraint - jak znaleźć winowajcę

Zacząłem tropić problem i wyszukałem jeszcze to:

hqdb-# \d eam_measurement_data
    Table "public.eam_measurement_data"
     Column     |     Type      | Modifiers 
----------------+---------------+-----------
 measurement_id | integer       | not null
 timestamp      | bigint        | not null
 value          | numeric(24,5) | 
Indexes:
    "measurement_data_id_time_pk" PRIMARY KEY, btree (measurement_id, "timestamp")
    "measurement_data_time_idx" btree ("timestamp")

8

Odp: duplicate key violates unique constraint - jak znaleźć winowajcę

Dzięki za tego selecta do wyszukiwania podwójnych wpisów. Mam jeszcze jedno pytanie. Patrząc na tę tabelę powyżej czy mógłbyś mi powiedzieć na postawie tego błędu która kolumna zawiera ten błędny podwójny wpis? Bo jak popatrzyłem na to:

ERROR:  duplicate key violates unique constraint "measurement_data_id_time_pk"

potem na to:

ALTER TABLE ONLY eam_measurement_data
    ADD CONSTRAINT measurement_data_id_time_pk PRIMARY KEY (measurement_id, "timestamp");

i w końcu na to:

hqdb-# \d eam_measurement_data
    Table "public.eam_measurement_data"
     Column     |     Type      | Modifiers 
----------------+---------------+-----------
 measurement_id | integer       | not null
 timestamp      | bigint        | not null
 value          | numeric(24,5) | 
Indexes:
    "measurement_data_id_time_pk" PRIMARY KEY, btree (measurement_id, "timestamp")
    "measurement_data_time_idx" btree ("timestamp")

To w końcu zgłupiałem do reszty. Na których kolumnach jest wreszcie ten zepsuty PK? measurement_id czy timestamp?
przecież PK to zawsze jedna kolumna, a tu są dwie.

Skoro REINDEX DATABASE jest do naprawiania indeksów to jak to może zrobić bez usuwania podwójnego pk? Przecież jedynym błędem pk jest właśnie podwójny wpis. Bez tego to narzędzie jest bez sensu.

9

Odp: duplicate key violates unique constraint - jak znaleźć winowajcę

10

Odp: duplicate key violates unique constraint - jak znaleźć winowajcę

Dzięki za linka. Poczytałem trochę  też o primary key i zrozumiałem, że może być na więcej niż jednej kolumnie. Wtedy w kolumnach mogą być podwójne wpisy i to jest OK. Dopiero kiedy wszystkie kolumny będące indexem zawierają jako wiersz to samo co inny wiersz w tej tabeli to wtedy jest błąd.

11

Odp: duplicate key violates unique constraint - jak znaleźć winowajcę

Jeszcze jedno pytanie jak skasować duplikaty i zostawić tylko 1 oryginał?
To usuwa wszystko, choć zaznaczyłem offsetem aby zostawił pierwszy wpis.
delete from eam_measurement_data where measurement_id in (select measurement_id from eam_measurement_data where measurement_id='123' and timestamp='456' offset 1);

12

Odp: duplicate key violates unique constraint - jak znaleźć winowajcę

To zapytanie delete, skasuje wszystkie wiersze z measurment_id=123.
Sprawdz czy masz zdefiniowane w tabeli oid'y np zapytaniem

select  oid, measurment_id from eam_measurement_data;

Czy pojawia sie jakies wartosci w kolumnie oid (i czy w ogóle pojawi sie kolumna oid)