Informix - создать внешний ключ при создании таблицы - PullRequest
0 голосов
/ 30 апреля 2018

Документацию на странице IBM можно посмотреть здесь:

https://www.ibm.com/support/knowledgecenter/en/SSGU8G_12.1.0/com.ibm.sqls.doc/ids_sqs_0103.htm#ids_sqs_0103

Но при попытке выполнить следующее я получаю сообщение об ошибке:

CREATE TABLE relacion_Usuarios_pertenecen_Instituto
 (
  foranea_CI_usuario  REFERENCES Usuarios CI,
  foranea_id_instituto  REFERENCES Institutos id_instituto,
  PRIMARY KEY (foranea_CI_usuario,foranea_id_instituto)
 );

Ошибка, которую я получаю:

  201: A syntax error has occurred.
Error in line 77
Near character position 29

Строка 77 - это вторая строка моего фрагмента.

Я пробовал разные комбинации возможных синтаксисов, и у меня всегда есть общая "синтаксическая ошибка".

Что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Как сказал Джонатан, используемый вами синтаксис неверен. Это должно быть примерно так:

--drop table if exists usuarios;
create table Usuarios (CI int UNIQUE);
--drop table if exists institutos;
create table Institutos (id_instituto int UNIQUE);

CREATE TABLE relacion_Usuarios_pertenecen_Instituto
 (
  foranea_CI_usuario INT REFERENCES Usuarios (CI),
  foranea_id_instituto  INT REFERENCES Institutos (id_instituto),
  PRIMARY KEY (foranea_CI_usuario,foranea_id_instituto)
 );

Следующая страница содержит пример базового ссылочного ограничения:

0 голосов
/ 30 апреля 2018

На основе примера J_S вы также можете назвать ограничения в таблице relacion_usuarios_pertenecen_instituto, используя синтаксис SQL Informix:

CREATE TABLE usuarios 
(
    ci INTEGER UNIQUE CONSTRAINT usuarios_un1
);

CREATE TABLE institutos 
(
    id_instituto INTEGER UNIQUE CONSTRAINT institutos_un1
);

CREATE TABLE relacion_usuarios_pertenecen_instituto
(
    foranea_ci_usuario INTEGER REFERENCES usuarios (ci) CONSTRAINT relacion_usuarios_pertenecen_instituto_fk1
    , foranea_id_instituto  INTEGER REFERENCES institutos (id_instituto) CONSTRAINT relacion_usuarios_pertenecen_instituto_fk2
    , PRIMARY KEY (foranea_ci_usuario, foranea_id_instituto) CONSTRAINT relacion_usuarios_pertenecen_instituto_pk
);

Вы можете использовать свой предпочтительный метод для создания имен ограничений. Я использую имя таблицы, а затем добавляю суффикс, чтобы дифференцировать его тип: _pk для PRIMARY KEY, _fk # для FOREIGN KEY и т. Д. Он становится немного многословным, но идентификаторы Informix могут достигать 128 байт ( Идентификатор ) (dbaccess немного ограничен для отображения длинных имен).

0 голосов
/ 30 апреля 2018

Если вы перечислите столбцы, на которые ссылаетесь, имена столбцов, на которые ссылаются, должны быть заключены в скобки (которые могут содержать разделенный запятыми список имен столбцов).

Если ваш внешний ключ ссылается на первичный ключ другой таблицы, достаточно указать имя ссылочной таблицы.

(Также обратите внимание, что в операторах CREATE TABLE в вопросе опущены типы данных столбцов в таблице, что приводит к общей синтаксической ошибке.)

Таким образом, вы можете использовать:

CREATE TABLE relacion_Usuarios_pertenecen_Instituto
(
    foranea_CI_usuario    INTEGER NOT NULL
                          REFERENCES Usuarios(CI) CONSTRAINT f1_relacion_usarios_pertencen_instituto,
    foranea_id_instituto  INTEGER NOT NULL
                          REFERENCES Institutos   CONSTRAINT f2_relacion_usarios_pertencen_instituto,
    PRIMARY KEY (foranea_CI_usuario, foranea_id_instituto)
    CONSTRAINT pk_relacion_usarios_pertencen_instituto
);

Первый из них явно ссылается на столбец CI таблицы Usuarios, который не должен быть первичным ключом этой таблицы (но если это не первичный ключ, он должен иметь уникальное ограничение на ключе). Второй не указывает столбцы (больше; столбец был указан в вопросе), предполагая, что столбец id_instituto таблицы Institutos на самом деле является первичным ключом этой таблицы.

Обратите внимание, что у вас может быть первичный ключ из нескольких столбцов, и, следовательно, любые внешние ключи, которые ссылаются на этот первичный ключ, будут внешними ключами из нескольких столбцов. Часто лучше избегать таких ключей и использовать столбец «ID» (часто основанный на типах SERIAL или BIGSERIAL) в качестве первичного ключа. Затем важно обеспечить ограничение уникальности для ключа из нескольких столбцов, превратив его в альтернативный ключ.

...