Informix - 在创建 Table 时创建外键
Informix - Create a Foreign key while creating Table
我可以在此处查看 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 行是我的代码片段的第二行。
我尝试了不同的可能语法组合,我总是有一个通用的"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
对于显示长名称有点限制)。
我可以在此处查看 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 行是我的代码片段的第二行。
我尝试了不同的可能语法组合,我总是有一个通用的"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
对于显示长名称有点限制)。