1

Temat: duplicate key violates unique constraint on the primary key

Używam frameworka web2py opartego na Pythonie. Wspieram się PostgreSQL. Obecnie utworzyłem strukturę tabeli 'city' (tabela jest pusta) i staram się zaimportować do niej dane z pliku CSV. Przy każdej próbie importu otrzymuje błąd:

duplicate key violates unique constraint 'city_country_key'

Kolumna 'country' jest ustawiona na UNIQUE.

W sieci znalazłem sporo podobnych problemów i jednym z powodów był brak synchronizacji między 'city' a 'city_id_seq'. W moim przypadku jednak najwyraźniej wszystko gra, ponieważ:

A. select max(id) from city; - nic nie zwraca (tabela 'city' jest pusta jak pisałem)
B. select nextval('city_id_seq'); - zwraca liczbę typu integer

a więc wynik B. > wyniku A. Wygląda na to, że wszystko jest w porządku, ale nie jestem pewien. O co może chodzić? Siedzę nad tym importem cały dzień. Czy problem może leżeć w tym, że max(id) z tabeli 'city' jest puste?

Będę wdzięczny za pomoc.

2

Odp: duplicate key violates unique constraint on the primary key

3

Odp: duplicate key violates unique constraint on the primary key

Osobiście strzelam w błędne dane źródłowe (tzn. to co ładujesz). Jeśli w tabeli nic nie ma (select count(*) from tabela jest "0"), a import wywala unique violation, to masz nieunikatowe wartości w danych ładowanych.

--
The best thing about modern society is how easy it is to avoid contact with it.

4

Odp: duplicate key violates unique constraint on the primary key

5

Odp: duplicate key violates unique constraint on the primary key

Tak po mojemy, to ta struktura w pg nie ma sensu. country unique? W sensie możesz mieć tylko jedno miasto w danym kraju?
W mysql'u masz unique na 3 kolumnach: (country, name, region). Czyli jedno miasto o danej nazwie w tym samym regionie w tym samym kraju. Wersja Pg jest zupełnie inna.

--
The best thing about modern society is how easy it is to avoid contact with it.

6

Odp: duplicate key violates unique constraint on the primary key

Otóż to, to bez sensu. Potrzebuje więc UNIQUE na dodatkowych 2 kolumnach, zgadza się?

7

Odp: duplicate key violates unique constraint on the primary key

wykonaj polecenia
ALTER TABLE city DROP CONSTRAINT city_country_key;
ALTER TABLE city ADD CONSTRAINT city_country_key UNIQUE (name, country, region);

Po wszystkim tabela city nie pozwoli dodać więcej niż jednego miasta w tym samym regionie i państwie

8

Odp: duplicate key violates unique constraint on the primary key

nie wiem jak ci odpowiedzieć. zasadniczo tak. ale nie poprzed dołożenie dwóch dodatkowych unique na pozostałych dwóch kolumnach.
poza tym "potrzebuje" - nie wiem czego potrzebujesz. wiem jedynie, ze struktura jaka pokazales z pg, jest inna niz ta z mysqla.

--
The best thing about modern society is how easy it is to avoid contact with it.

9

Odp: duplicate key violates unique constraint on the primary key

OK, dam znać, jak znajdę rozwiązanie.

10

Odp: duplicate key violates unique constraint on the primary key

@c_michal, sorry, przeoczyłem twój post. A szkoda, po pomógł smile Dzięki!

11

Odp: duplicate key violates unique constraint on the primary key

Tak będzie działało ale do czasu smile
Spróbuj zewidencjonować w swojej tabeli dwie miejscowości LIPNO (naprawdę istnieją w Polsce)
- Lipno - (woj. kujawsko-pomorskie, powiat: lipnowski, gm/m: Lipno) nr teryt 040801
- Lipno - (woj. kujawsko-pomorskie, powiat: lipnowski, gm/m: Lipno) nr teryt 040806

12

Odp: duplicate key violates unique constraint on the primary key

Hm, a mógłbyś nieco jaśniej, kiedy PRZESTANIE działać? smile

Select znalazł oba Lipna. Wynik:

country | name  | region
---------+-------+--------
PL      | Lipno | 68
PL      | Lipno | 68

13

Odp: duplicate key violates unique constraint on the primary key

Jeżeli masz na tabeli klucz unikatowy na kolumny (name, country, region) to nie wprowadzisz dwóch jednakowych wartości dla tych pól (dlatego myślę, że jeden z twoich rekordów jest trochę zmanipulowany np w jednym rekordzie pole name ma wartość "Lipno", a w drugim "Lipno " - spacja na końcu dla postgresa to duża różnica dla człowieka już nie)

PS Ten sam problem dotyczy użycia dużych i małych liter w nazwie dla postgresa to różne wartości - oczywiście są sposoby by sobie z takimi przypadkami radzić ale raczej nie w twoim projekcie (w końcu odwzorowujesz tylko funkcjonalność z już istniejącej bazy na MySQL-u)

14

Odp: duplicate key violates unique constraint on the primary key