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