Я недавно начал разрабатывать приложения с 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 преобразует сериалы в целые числа, автоматическое инкрементирование останавливается.
Что такое ** точная ** команда, которую вы используете для сброса структуры? Файл должен содержать вставки для таблицы, которая использует эту последовательность, и эти вставки должны увеличивать последовательность. Btw: вам следует избегать использования цитируемых идентификаторов, они намного сложнее, чем они того стоят (я также сомневаюсь в использовании префикса 'tbl' - префикс ли вы все ваши классы на вашем языке программирования с помощью класса?) –
Я добавил команду pg_dump в нижней части исходного комментария – user3818264
Сценарий файла дампа сначала создает таблицу, которая устанавливает последовательность в 0, а затем выполняет вставки - но она фактически вставляет значения для iID. Будет ли это поддерживать природу последовательности? – user3818264