Informix - 在创建 Table 时创建外键

Informix - Create a Foreign key while creating Table

我可以在此处查看 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 行是我的代码片段的第二行。

我尝试了不同的可能语法组合,我总是有一个通用的"syntax error"。

我做错了什么?

如果列出要引用的列,则引用的列名称应括在括号中(可以包含以逗号分隔的列名称列表)。

如果你的外键引用了另一个table的主键,指定被引用的名称就足够了table。

(另请注意,问题中的 CREATE TABLE 语句省略了 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
);

第一个显式引用 Usuarios table 的 CI 列,它不一定是 table 的主键(但如果它不是主键,则它必须对该键具有唯一约束)。第二个不指定列(不再指定;列在问题中指定),假设 Institutos table 的 id_instituto 列实际上是该列的主键table.

请注意,您可以有一个多列主键,因此任何引用该主键的外键都将是多列外键。通常最好避免使用此类键并使用 'ID' 列(通常基于 SERIAL 或 BIGSERIAL 类型)作为主键。然后对多列键强制执行唯一性约束,使其成为替代键很重要。

正如乔纳森所说,您使用的语法是错误的。它应该是这样的:

--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)
 );

以下页面包含一个基本的引用约束示例:

基于J_S示例,您还可以使用 Informix SQL 语法命名 relacion_usuarios_pertenecen_instituto table 中的约束:

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
);

您可以使用您喜欢的方法来创建约束名称。我使用 table 名称,然后附加一个后缀来区分其类型:_pk 代表 PRIMARY KEY,_fk# 代表 FOREIGN KEY,等等。它变得有点冗长,但 Informix 标识符可以最多 128 字节 (Identifier)(dbaccess 对于显示长名称有点限制)。