ОШИБКА: схема отношения.TableName_Id_seq не существует - при создании таблицы в новой базе данных

У меня возникла проблема, когда я использовал графический интерфейс pgAdmin4 для создания таблицы 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" не существовало в исходной базе данных до создания этой таблицы. Что происходит, что отличается?


person Joshua Schlichting    schedule 04.05.2020    source источник
comment
Не имеет отношения к вашей проблеме, но: вам действительно следует избегать этих ужасных идентификаторов в кавычках. Они доставляют гораздо больше хлопот, чем того стоят. wiki.postgresql.org/wiki/   -  person a_horse_with_no_name    schedule 04.05.2020
comment
@a_horse_with_no_name Согласен! Приведенный выше скрипт сгенерирован самим pgAdmin4 и/или PostgreSQL, а не мной!   -  person Joshua Schlichting    schedule 04.05.2020
comment
Сценарий лишь отражает то, что было сделано ранее. В какой-то момент кто-то запустил CREATE TABLE с ужасными идентификаторами в кавычках.   -  person a_horse_with_no_name    schedule 04.05.2020
comment
Знаете что, по вашей ссылке я заметил, что эти двойные кавычки, вероятно, там из-за заглавных букв в имени таблицы. Я не понимал, что это то, что происходит. Теперь я буду избегать этого, спасибо, что поделились, @a_horse_with_no_name.   -  person Joshua Schlichting    schedule 04.05.2020
comment
@a_horse_with_no_name Изначально таблица была создана с помощью графического интерфейса pgAdmin4, а не с помощью написанного вручную сценария CREATE TABLE. РЕДАКТИРОВАТЬ: я только что создал новую таблицу и проверил ее с помощью pgAdmin4. Разумеется, если вы используете заглавные буквы при создании таблицы, pgAdmin4 неявно заключает ее в двойные кавычки при создании этой таблицы. Хорошо знать!   -  person Joshua Schlichting    schedule 04.05.2020


Ответы (1)


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

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

  • -> ваш сервер
  • -> ваша база данных
  • -> ваша схема
  • -> Последовательности
  • -> Щелкните правой кнопкой мыши 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,

person Joshua Schlichting    schedule 04.05.2020