Почему PostgreSQL ругается?
Адаптирую ddl файл из db2 в postgre, получаю SQL Error [42601]: ERROR: syntax error at or near "IN".
Вот код:
CREATE TABLE "AXIOMA "."ODK_CLASSSTRUCTURE" ( "ODK_OBJECTTYPE" VARCHAR(20 ) , "ODK_HSE" INTEGER NOT NULL , "ODK_THEMETYPE" VARCHAR(50 ) , "ODK_ISOLATIONFLAG" INTEGER NOT NULL ) IN "AXIDATA" INDEX IN "AXIINDEX" ORGANIZE BY ROW ; |
CREATE TABLE "AXIOMA "."ODK_CLASSSTRUCTURE" ( "ODK_OBJECTTYPE" VARCHAR(20 ) , "ODK_HSE" INTEGER NOT NULL , "ODK_THEMETYPE" VARCHAR(50 ) , "ODK_ISOLATIONFLAG" INTEGER NOT NULL ) IN "AXIDATA" INDEX IN "AXIINDEX" ORGANIZE BY ROW ;
Дополнительно:
https://www.postgresql.org/docs/current/sql-create...
А почему PostgreSQL не должен ругаться на диалект DB2? Разные СУБД, разные диалекты. Не всё, что возможно в одной СУБД, напрямую переносится в другую.
Хотите, чтобы запросы работали везде более-менее одинаково - используйте подмножество ANSI (SQL-89 или SQL-92). Хотите переносить нативные запросы из одной СУБД в другую - изучайте обе и ищите аналоги команд/функций/опций.
Ответы:
А почему не должен ругаться?
Ни малейших представлений что это за синтаксис такой.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
PostgreSQL ругается правильно: это не синтаксис PostgreSQL, а DDL из DB2. Конструкция IN "AXIDATA" INDEX IN "AXIINDEX" ORGANIZE BY ROW относится к DB2 и в PostgreSQL не поддерживается.
В PostgreSQL таблицу нужно создать без этих опций:
CREATE TABLE axioma.odk_classstructure (
odk_objecttype varchar(20),
odk_hse integer NOT NULL,
odk_themetype varchar(50),
odk_isolationflag integer NOT NULL
);
Если AXIOMA - это схема, её нужно заранее создать:
CREATE SCHEMA IF NOT EXISTS axioma;
Аналоги tablespace в PostgreSQL существуют, но это отдельная настройка и она не пишется так же, как в DB2. Индексы тоже создаются отдельными командами CREATE INDEX. Поэтому при миграции DDL нельзя просто заменить типы данных и оставить хвост DB2-команд. Нужно отдельно пройтись по:
- схемам;
- типам данных;
- primary key / foreign key;
- индексам;
- tablespace, если он вообще нужен;
- специфичным DB2-опциям.
В PostgreSQL ошибка стоит около IN, потому что после закрывающей скобки списка колонок он не ожидает DB2-опции размещения таблицы. Для PostgreSQL такой хвост нужно убрать или заменить на его собственные механизмы.
Минимально рабочий вариант будет таким:
CREATE TABLE "AXIOMA"."ODK_CLASSSTRUCTURE" (
"ODK_OBJECTTYPE" varchar(20),
"ODK_HSE" integer NOT NULL,
"ODK_THEMETYPE" varchar(50),
"ODK_ISOLATIONFLAG" integer NOT NULL
);
Но я бы ещё рекомендовал отказаться от лишних кавычек и верхнего регистра, если это новый проект в PostgreSQL. Иначе потом все обращения к таблицам и колонкам придётся писать строго в кавычках и строго с тем же регистром.
Лучше так:
CREATE TABLE axioma.odk_classstructure (
odk_objecttype varchar(20),
odk_hse integer NOT NULL,
odk_themetype varchar(50),
odk_isolationflag integer NOT NULL
);
Если при переносе нужны индексы из DB2, создавайте их отдельно после таблицы. Сам DDL из DB2 нужно не “адаптировать кусками”, а конвертировать с учётом различий двух СУБД.

PostgreSQL может ругаться по разным причинам, в зависимости от конкретной ситуации. Ниже приведены некоторые из наиболее распространенных причин и способы их решения:
1. Ошибка синтаксиса SQL: Если PostgreSQL ругается на ошибку синтаксиса SQL, это может быть вызвано неправильным использованием ключевых слов, забытыми запятыми или скобками, неверным порядком операций и т.д. В этом случае, внимательно проверьте свой SQL запрос и убедитесь, что он написан правильно.
2. Ограничения безопасности: PostgreSQL может ругаться, если вы пытаетесь выполнить операцию, на которую у вас нет прав доступа. Убедитесь, что у вас есть необходимые привилегии для выполнения операции, и запросите их у администратора базы данных при необходимости.
3. Несоответствие типов данных: Если типы данных в ваших запросах не соответствуют ожидаемым типам данных в таблице, PostgreSQL может ругаться. Убедитесь, что вы используете правильные типы данных и преобразуйте их при необходимости.
4. Нарушение ограничений уникальности: Если вы пытаетесь вставить запись, которая нарушает ограничение уникальности в таблице, PostgreSQL выдаст ошибку. Проверьте данные, которые вы пытаетесь вставить, и убедитесь, что они уникальны.
5. Недостаточно памяти или ресурсов: Если PostgreSQL не может выполнить запрос из-за недостатка памяти или других ресурсов, он также может выдать ошибку. Увеличьте выделенные ресурсы для PostgreSQL или оптимизируйте ваш запрос, чтобы уменьшить его нагрузку на систему.
Надеюсь, что перечисленные выше рекомендации помогут вам понять, почему PostgreSQL ругается, и решить проблему. Если у вас остались дополнительные вопросы, не стесняйтесь задавать их для получения дополнительной помощи.