2015-10-09 4 views
0

Я недавно начал разрабатывать приложения с PostgreSQL в качестве базы данных DB (наложенных на меня) без предыдущего опыта Postgres. Пока это было не так уж плохо, но теперь я столкнулся с проблемой, на которую я не могу найти ответ.pg_dump настройка последовательностей

Я создал пакетные скрипты, которые запускают команду pg_dump для конкретной базы данных на сервере. Этот командный файл выполняется по расписанию с помощью pgAgent.

Сам pg_dump работает нормально. Вся структура базы данных и данные сбрасываются в файл. Однако все последовательности устанавливается в 1. Например для таблицы tbl_departments свалка последовательность выглядит следующим образом:

CREATE SEQUENCE "tbl_departments_iID_seq" 
    START WITH 1 
    INCREMENT BY 1 
    NO MINVALUE 
    NO MAXVALUE 
    CACHE 1; 


ALTER TABLE "tbl_departments_iID_seq" OWNER TO postgres; 

ALTER SEQUENCE "tbl_departments_iID_seq" OWNED BY tbl_departments."iID"; 

В этом конкретном примере последовательность должна быть установлена, чтобы начать с 8, так как последний добавленный запись имеет iID = 7.

Как сделать pg_dump установить начальный номер последовательности, следующий для каждой таблицы?

Команда для дампа: % PGBIN% pg_dump -h 192.168.0.112 -U Postgres -F р -b -v -f --inserts "\\ 192.168.0.58 \ PostgresDB \ Backup \ internals_db.sql" Internals

EDIT:

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

CREATE TABLE tbl_departments 
(
    "iID" serial NOT NULL, -- id, autoincrement 
    "c150Name" character varying(150) NOT NULL, -- human readable name for department 
    "bRetired" boolean NOT NULL DEFAULT false, -- if TRUE that it is no longer active 
    "iParentDept" integer NOT NULL DEFAULT 0, -- ID of the parent department 
    CONSTRAINT tbl_departments_pkey PRIMARY KEY ("iID") 
) 

Заявление pg_dump является:

CREATE TABLE tbl_departments (
     "iID" integer NOT NULL, 
     "c150Name" character varying(150) NOT NULL, 
     "bRetired" boolean DEFAULT false NOT NULL, 
     "iParentDept" integer DEFAULT 0 NOT NULL 
    ); 


    ALTER TABLE tbl_departments OWNER TO postgres; 

    COMMENT ON TABLE tbl_departments IS 'list of departments'; 

    COMMENT ON COLUMN tbl_departments."iID" IS 'id, autoincrement'; 

    COMMENT ON COLUMN tbl_departments."c150Name" IS 'human readable name for department'; 


    COMMENT ON COLUMN tbl_departments."bRetired" IS 'if TRUE that it is no longer active'; 

    COMMENT ON COLUMN tbl_departments."iParentDept" IS 'ID of the parent department'; 

    CREATE SEQUENCE "tbl_departments_iID_seq" 
     START WITH 1 
     INCREMENT BY 1 
     NO MINVALUE 
     NO MAXVALUE 
     CACHE 1; 

     ALTER TABLE "tbl_departments_iID_seq" OWNER TO postgres; 

     ALTER SEQUENCE "tbl_departments_iID_seq" OWNED BY tbl_departments."iID"; 

    INSERT INTO tbl_departments VALUES (1, 'Information Technologies', false, 0); 
    INSERT INTO tbl_departments VALUES (2, 'Quality Control', false, 0); 
    INSERT INTO tbl_departments VALUES (3, 'Engineering', false, 0); 
    INSERT INTO tbl_departments VALUES (5, 'Quality Assurance', false, 0); 
    INSERT INTO tbl_departments VALUES (6, 'Production', false, 2); 

    ALTER TABLE ONLY tbl_departments 
     ADD CONSTRAINT tbl_departments_pkey PRIMARY KEY ("iID"); 

SELECT pg_catalog.setval('"tbl_departments_iID_seq"', 1, false); 

pg_dump устанавливает столбец IID в целое, а не серийный, которые отключили автоматическое приращение. Значение setval также равно 1, а не 7, как и следовало ожидать.

Когда я открываю приложение front-end и перехожу к добавлению нового отдела, он терпит неудачу, потому что все, что я предоставляю, это: имя нового отдела, активное/отключенное (true/false), идентификатор родительского подразделения. (0, если нет родителя).

Я ожидаю, что первичный ключ iID новой записи будет автоматически создан БД, что, насколько мне известно, является ожидаемой базовой функцией любой РСУБД.

потому что pg_dump преобразует сериалы в целые числа, автоматическое инкрементирование останавливается.

+1

Что такое ** точная ** команда, которую вы используете для сброса структуры? Файл должен содержать вставки для таблицы, которая использует эту последовательность, и эти вставки должны увеличивать последовательность. Btw: вам следует избегать использования цитируемых идентификаторов, они намного сложнее, чем они того стоят (я также сомневаюсь в использовании префикса 'tbl' - префикс ли вы все ваши классы на вашем языке программирования с помощью класса?) –

+0

Я добавил команду pg_dump в нижней части исходного комментария – user3818264

+0

Сценарий файла дампа сначала создает таблицу, которая устанавливает последовательность в 0, а затем выполняет вставки - но она фактически вставляет значения для iID. Будет ли это поддерживать природу последовательности? – user3818264

ответ

2

Нет причин для беспокойства. Сгенерированный SQL-файл будет восстанавливать текущие значения последовательностей. Откройте файл с редактором и найдите setval. Там должны быть линии, как это:

SELECT pg_catalog.setval('test_id_seq', 1234, true); 

Если вы не можете найти их это означает, что команды INSERT установить правильное значение последовательности.


Как заметил Крейг, текущее значение последовательности должен быть равен 1 в момент сброса исходной базы данных. Вероятно, вы ввели значения iID, не используя default. В этом случае последовательность не используется.

Поэтому я предлагаю начать с самого начала, но в двух базах данных:

  • сделать SQL дамп, как в вопросе,
  • создать новую базу данных,
  • запустить сценарий SQL в новом базы данных,
  • проверить, соответствуют ли соответствующие последовательные столбцы одной и той же декларации в обеих базах данных,
  • сравнить текущие значения соответствующих последовательностей в обеих базах данных.
+0

Ну, я беспокоюсь, проверьте мое второе редактирование. Спасибо – user3818264

+0

В ** edit1 ** не было 'setvals' и в ** edit2 ** вдруг появился? Ваш вопрос непоследовательный. Я бы предложил вам сбросить тест и начать с самого начала. – klin

+0

«неожиданно» появляется, когда я добавляю информацию в ответ на предложения. Я отредактировал оригинал, чтобы включить все части файла дампа, которые связаны с созданием, изменением и вводом данных для этой конкретной таблицы, в которой они появляются. – user3818264

2

pg_dump задает столбец IID в целое, а не серийный, который отключили автоматическое приращение.

Это нормально. См. the manual.

SERIAL в основном только обсчитывать для CREATE SEQUENCE, а затем в integer столбец, который делает эту последовательность его default для nextval('seq_name').

Установленное значение также равно 1, а не 7, как и следовало ожидать.

Я могу только объяснить это, предположив, что начальная точка последовательности равна 1 в БД. Возможно, из-за предыдущей попытки запустить DDL, который изменил ее, например setval или alter sequence?

setval это к начальной точке, которую вы ожидаете. Затем, пока вы не запускаете другие команды setval, команды alter sequence и т. Д., Все будет в порядке.

Возможно, приложение добавило значения непосредственно, без использования последовательности?