Почему возникает ошибка constraint for relation already exists при импорте базы postgres?

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
EVOSandru6
Сообщения: 605
Зарегистрирован: 2014.07.04, 13:33

Почему возникает ошибка constraint for relation already exists при импорте базы postgres?

Сообщение EVOSandru6 »

Добрый день,

Такая проблема.

Есть рабочий сайт с именем domen1. Делаю экспорт в pgAdmin ||| . Выбрал:

Кодировка UTF-8, Владелец - postgres, Выставил галочки на DROP, INSERT.

Собрался бэкап. Если я импортирую его на другой машине в базу с таким же именем ( dbname1 ) , импорт проходит успешно. Если же сливаю импорт в базу с другим именем dbname2, происходит подобная ерунда:

psql:dump_1.sql:8266: ERROR: constraint "mc_valutes_tenant_id_fkey" for relation "mc_courses" already exists
multiple primary keys for table "f_pays" are not allowed
DETAIL: Key (id)=(631010000) already exists.
psql:dump_1.sql:7527: ERROR: duplicate key value violates unique constraint "t_places_pkey"



Импорт делаю в debian:

Код: Выделить всё

sudo -su postgres psql dbname2 
\i dump.sql
В sql файле проверял, имена внешних ключей не повторяются.

В чем может быть проблема?

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Почему возникает ошибка constraint for relation already exists при импорте базы postgres?

Сообщение zelenin »

EVOSandru6 писал(а):Делаю экспорт в pgAdmin ||| .
кстати, советую dbeaver (мультиплатформенный, мультивендорный).
EVOSandru6 писал(а): Выбрал:

Кодировка UTF-8, Владелец - postgres, Выставил галочки на DROP, INSERT.

Собрался бэкап. Если я импортирую его на другой машине в базу с таким же именем ( dbname1 ) , импорт проходит успешно. Если же сливаю импорт в базу с другим именем dbname2, происходит подобная ерунда:

psql:dump_1.sql:8266: ERROR: constraint "mc_valutes_tenant_id_fkey" for relation "mc_courses" already exists
multiple primary keys for table "f_pays" are not allowed
DETAIL: Key (id)=(631010000) already exists.
psql:dump_1.sql:7527: ERROR: duplicate key value violates unique constraint "t_places_pkey"



Импорт делаю в debian:

Код: Выделить всё

sudo -su postgres psql dbname2 
\i dump.sql
В sql файле проверял, имена внешних ключей не повторяются.

В чем может быть проблема?
id таблицы хранятся в отдельной последовательности, которая не дропается вместе с таблицей. Предположу, что дело в этом:

Код: Выделить всё

id serial NOT NULL DEFAULT nextval('schema_service.service_id_seq'::regclass),
хотя если ошибку почитать, то понятного мало. импорт частичный или полностью БД? drop bdname перед началом импорта может помочь.

EVOSandru6
Сообщения: 605
Зарегистрирован: 2014.07.04, 13:33

Re: Почему возникает ошибка constraint for relation already exists при импорте базы postgres?

Сообщение EVOSandru6 »

Благодарю, импорт полный. Если я дропну dbname1, то упадет site1, этого делать нельзя.

id serial NOT NULL DEFAULT nextval('schema_service.service_id_seq'::regclass),
Как это лечится? Полностью перекапывать sql файл? При создании базы dbname1 - писал так для первичных ключей:

id serial Autoincrement;

Не понял, почему изменилась строка куска запроса для данного поля.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Почему возникает ошибка constraint for relation already exists при импорте базы postgres?

Сообщение zelenin »

EVOSandru6 писал(а):Благодарю, импорт полный. Если я дропну dbname1, то упадет site1, этого делать нельзя.

id serial NOT NULL DEFAULT nextval('schema_service.service_id_seq'::regclass),
Как это лечится? Полностью перекапывать sql файл? При создании базы dbname1 - писал так для первичных ключей:

id serial Autoincrement;

Не понял, почему изменилась строка куска запроса для данного поля.
в postgres id берутся из отдельной последовательности. autoincrement лишь алиас для этого. последовательность не привязана к таблице, поэтому не дропается вместе с ней. надо дропать.

R3D3
Сообщения: 352
Зарегистрирован: 2010.04.11, 14:52

Re: Почему возникает ошибка constraint for relation already exists при импорте базы postgres?

Сообщение R3D3 »

При создании базы dbname1 - писал так для первичных ключей:

id serial Autoincrement;
Какая у вас версия postgres и это точно postgres ? Потому что в нем нету конструкции autoincrement, насколько я знаю. Тип SERIAL уже подразумевает создание integer поля, последовательности для него и привязки последовательности к этому полю.
8.1.4. Serial Types

The data types serial and bigserial are not true types, but merely a notational convenience for creating unique identifier columns (similar to the AUTO_INCREMENT property supported by some other databases). In the current implementation, specifying:

Код: Выделить всё

CREATE TABLE tablename (
    colname SERIAL
);
is equivalent to specifying:

Код: Выделить всё

CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;
И еще, в случае если поле было создано как SERIAL, то при удалении таблицы последовательность также автоматически удалится.

Код: Выделить всё

$ psql sometest
psql (9.4.6)
Type "help" for help.

sometest=> \d
No relations found.
sometest=> create table t1(id serial);
CREATE TABLE
sometest=> \d
           List of relations
 Schema |   Name    |   Type   | Owner  
--------+-----------+----------+--------
 public | t1        | table    | ubuntu
 public | t1_id_seq | sequence | ubuntu
(2 rows)

sometest=> drop table t1;
DROP TABLE
sometest=> \d
No relations found.
sometest=> create table t1(id serial Autoincrement);
ERROR:  syntax error at or near "Autoincrement"
LINE 1: create table t1(id serial Autoincrement);
                                  ^
sometest=> 
По проблеме из первого поста
psql:dump_1.sql:8266: ERROR: constraint "mc_valutes_tenant_id_fkey" for relation "mc_courses" already exists
multiple primary keys for table "f_pays" are not allowed
Посмотрите, есть ли изначально в базе dbname2 констрейнт под названием mc_valutes_tenant_id_fkey, т.к. ошибка говорит о том что при импорте дампа он уже существует.
Yii Jabber Conference: yii@conference.jabber.ru

EVOSandru6
Сообщения: 605
Зарегистрирован: 2014.07.04, 13:33

Re: Почему возникает ошибка constraint for relation already exists при импорте базы postgres?

Сообщение EVOSandru6 »

Благодарю,

Версия pgAdmin 1.22.0

вот нашел больное место в sql файле:

DROP DATABASE dbname1;
--
-- TOC entry 2642 (class 1262 OID 36968)
-- Name: hotel; Type: DATABASE; Schema: -; Owner: postgres
--

CREATE DATABASE dbname1 WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';

ALTER DATABASE dbname1 OWNER TO postgres;

\connect hotel


И в баше я захожу:

sudo -su postgres psql dbname2

появляется правильное имя:
dbname2=#

После неудачного импорта имя в башовской строке меняется на имя из импортированной базы:

dbname1=#

Как сделать, чтобы при бэкапе из pgadmin название базы не упоминалось?

Ответить