Informix - 在创建Table时创建外键

时间:2018-04-30 01:13:27

标签: foreign-keys informix

我可以在这里看到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 :(得分:4)

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

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

以下页面包含基本参照约束示例:

答案 1 :(得分:2)

基于J_S示例,您还可以使用Informix SQL sintaxe在relacion_usuarios_pertenecen_instituto表中命名约束:

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

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

答案 2 :(得分:1)

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

如果外键引用另一个表的主键,则只需指定引用表的名称即可。

(另请注意,问题中的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类型)作为主键。然后,重要的是对多列密钥强制执行唯一性约束,使其成为备用密钥。