我可以在这里看到IBM页面中的文档:
但是当我尝试以下操作时,我收到错误:
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行是我的代码段的第二行。
我尝试了不同的可能语法组合,并且总是有一个通用的“语法错误”。
我做错了什么?
答案 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类型)作为主键。然后,重要的是对多列密钥强制执行唯一性约束,使其成为备用密钥。