ОШИБКА: связь "schema.TableName_Id_seq" не существует - при создании таблицы в новой базе данных - PullRequest
0 голосов
/ 04 мая 2020

У меня возникла проблема, когда я использовал pgAdmin4 GUI для создания SQL таблицы и хочу использовать сгенерированный CREATE TABLE скрипт для создания этой же таблицы в другой базе данных.

Когда я запускаю сценарий CREATE TABLE, сгенерированный pgAdmin4 в моей новой базе данных, я получаю следующую ошибку:

ОШИБКА: отношение "schema.TableName_Id_seq" не существует

Итак, похоже, проблема связана с моим автоматически увеличивающимся столбцом идентификатора, который я создал как тип SERIAL.

Скрипт CREATE TABLE, предоставленный pgAdmin4:

-- Table: myschema.TableName

-- DROP TABLE myschema."TableName";

CREATE TABLE myschema."TableName"
(
    "Id" integer NOT NULL DEFAULT nextval('myschema."TableName_Id_seq"'::regclass),
    /* Other columns here */
    CONSTRAINT "TableName_pkey" PRIMARY KEY ("Id")
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE myschema."TableName"
    OWNER to JoshuaSchlichting;

Почему нельзя использовать сценарий CREATE TABLE в другой базе данных? Отношение "schema.TableName_Id_seq" не существовало в исходной базе данных до создания этой таблицы. Что происходит такого другого?

1 Ответ

2 голосов
/ 04 мая 2020

Сценарий DDL, предоставленный pgAdmin4, не завершен. При создании таблицы имело место неявное создание последовательности из-за того, что для столбца Id был выбран тип SERIAL.

Вы можете найти эту вновь созданную последовательность с помощью pgAdmin4. Для этого с go на

  • -> ваш сервер
  • -> ваша база данных
  • -> ваша схема
  • -> Последовательности
  • -> щелкните правой кнопкой мыши TableName_Id_seq
  • -> выберите «Создать скрипт»

Это показывает скрипт, использованный для создания этой последовательности. В этом случае было обнаружено следующее:

-- SEQUENCE: myschema.TableName

-- DROP SEQUENCE myschema."TableName";

CREATE SEQUENCE myschema."TableName"
    INCREMENT 1
    START 1
    MINVALUE 1
    MAXVALUE 2147483647
    CACHE 1;

Использование сценария CREATE SEQUENCE можно избежать, изменив строку кода, используемую для создания столбца Id в сценарии CREATE TABLE. Пример ниже:

исходная строка: "Id" integer NOT NULL DEFAULT nextval('myschema."TableName_Id_seq"'::regclass),

изменено на: "Id" SERIAL NOT NULL,

...