2015-10-09 5 views
2

Может кто-нибудь объяснить мне, почему таблица PostgreSQL создана с помощью следующих сценариев:pg_dump последовательный тип данных выдает

CREATE TABLE users 
(
    "id" serial NOT NULL, 
    "name" character varying(150) NOT NULL, 
    "surname" character varying (250) NOT NULL, 
    "dept_id" integer NOT NULL, 
    CONSTRAINT users_pkey PRIMARY KEY ("id") 
) 

получает сброшена pg_dump в следующем формате:

CREATE TABLE users(
     "id" integer NOT NULL, 
     "name" character varying(150) NOT NULL, 
     "surname" character varying (250) NOT NULL, 
     "dept_id" integer NOT NULL 
    ); 

ALTER TABLE users OWNER TO postgres; 

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

ALTER TABLE "users_id_seq" OWNER TO postgres; 
ALTER SEQUENCE "users_id_seq" OWNED BY users."id"; 
ALTER TABLE ONLY users 
ADD CONSTRAINT users_pkey PRIMARY KEY ("id"); 

Очевидно, что выше только небольшая выдержка из файла дампа.

Почему pg_dump преобразование типов данных серийных в целом? Когда я восстанавливаю базу данных из сброшенного SQL-файла, это в значительной степени становится бесполезным, потому что автоинкрементация перестает работать, а при добавлении новых записей из front-end-формы она терпит неудачу с сообщением вдоль поля идентификаторов строк, которое не может быть пустым », очевидно потому что это первичный ключ, который не равен null, но автоинкремент должен начинать заполнять поле и заполнять его следующим значением в последовательности.

Я что-то упустил?

+0

Какое совпадение: http://stackoverflow.com/q/33033642/2235885 (я полагаю, что это еще сентябрь?) Чтобы ответить на вопрос: серийный номер * не существует * serial - это просто сокращение для целого числа с default (последовательность). Обычно pg_dump выводит код для: (1) таблицы DDL, затем (2) вставляет данные, затем (3) создает последовательность + * прикрепляет * это к целочисленному полю + (4) устанавливает последовательность в максимальное число. – joop

+0

Вау! Это не сентябрь, но это тоже было задано сегодня и почти так же, как моя проблема :). В моем случае последовательность также не установлена ​​(SELECT pg_catalog.setval ('"users_id_seq", 1, false), пока она должна быть 178). Итак, как я могу гарантировать, что после восстановления автоинкрементация базы данных работает так же, как и до восстановления? – Peter

+0

'Очевидно, что это только небольшая выдержка из файла дампа.' Прокрутите до конца dumpfile (используя ваш любимый редактор ;-) И: возможно, добавьте номера ответов postgres + pg_dump на ваш вопрос. BTW - это ваш вывод из * complete * pg_dump или с флагом '--schema only '? – joop

ответ

0

Ну, он работает здесь. Тест сниппет:

DROP SCHEMA tmpdump ; 
CREATE SCHEMA tmpdump ; 
set search_path = tmpdump ; 

-- SELECT version(); 
DROP TABLE lusers; 
CREATE TABLE lusers 
(
    "id" serial NOT NULL 
    , "name" character varying(150) NOT NULL 
    , "surname" character varying (250) NOT NULL 
    , "dept_id" integer NOT NULL 
    , CONSTRAINT lusers_pkey PRIMARY KEY ("id") 
); 
INSERT INTO lusers ("name", "surname", "dept_id") VALUES 
     ('Joop', 'Zoetemelk', 2) , ('Jan', 'Jansen', 3) 
     , ('Ard', 'Schenk', 4) , ('Kees', 'Verkerk', 5); 

самосвала только tmpdump схема с:

pg_dump -U someusername yourdbname -n tmpdump -F p --inserts | less 
+0

Думаю, я нашел проблему. Дамп выполняется с помощью -inserts, а идентификаторы являются частью операторов вставки. Однако, если я этого не делаю, я рискую проблем с целостностью данных – Peter

3

От docs:

типы данных smallserial, serial и bigserial не являются истинными типы, а лишь нотация для создания уникальных столбцов идентификатора (похоже на свойство AUTO_INCREMENT suppo rted некоторыми другими базами данных). В текущей реализации, с указанием:

CREATE TABLE tablename (
    colname SERIAL 
); 

эквивалентно заданию:

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; 

Таким образом, мы создали целую колонку и организовал для ее значения по умолчанию, которые будут назначены от генератора последовательности. Ограничение NOT NULL применяется для обеспечения того, чтобы нулевое значение не могло быть вставлено. (В большинстве случаев вы также хотели бы привязать ограничение UNIQUE или PRIMARY KEY, чтобы предотвратить случайное добавление повторяющихся значений, но это не автоматическое.) Наконец, последовательность помечена как «принадлежащая» столбцу, так что будет сброшен, если столбец или таблица будут удалены.

Смежные вопросы