为什么sql developer上会出现此错误

为什么sql developer上会出现此错误,sql,oracle,create-table,Sql,Oracle,Create Table,我创建了表“Functionario” 但接下来是“Viagem”和“Encomenda” 告诉我这个错误。我不明白为什么,有人能帮我吗?我可以分享所有的脚本,如果你想看到所有。 出现的错误是: “ORA-02270:此列列表没有匹配的唯一键或主键 CREATE/ALTER TABLE语句中的REFERENCES子句提供 没有匹配的唯一键或主键的列列表 引用表中的约束 [编辑]脚本 -- Criar Tabela Zona Geografica CREATE TABLE ZonaGeograf

我创建了表“Functionario” 但接下来是“Viagem”和“Encomenda” 告诉我这个错误。我不明白为什么,有人能帮我吗?我可以分享所有的脚本,如果你想看到所有。 出现的错误是:

“ORA-02270:此列列表没有匹配的唯一键或主键

CREATE/ALTER TABLE语句中的REFERENCES子句提供 没有匹配的唯一键或主键的列列表 引用表中的约束

[编辑]脚本

-- Criar Tabela Zona Geografica

CREATE TABLE ZonaGeografica(
id_zona_geo INTEGER CONSTRAINT pk_ZonaGeografica_id_zona_geo PRIMARY KEY,
latitude INTEGER NOT NULL,
longitude INTEGER NOT NULL
);

-- Criar Tabela Armazem

CREATE TABLE Armazem(
cod_armazem INTEGER CONSTRAINT pk_Armazem_cod_armazem PRIMARY KEY,
id_zona_geo INTEGER NOT NULL,
nome VARCHAR(40) NOT NULL,
morada VARCHAR(50) NOT NULL,
CONSTRAINT fk_ZonaGeografica_id_zona_geo FOREIGN KEY (id_zona_geo) REFERENCES ZonaGeografica(id_zona_geo)
);

-- Criar Tabela TipoVeiculo

CREATE TABLE TipoVeiculo(
tipo_veiculo VARCHAR(20) CONSTRAINT pk_TipoVeiculo_tipo_veiculo PRIMARY KEY,
capacidade_volume INTEGER NOT NULL,
capacidade_peso INTEGER NOT NULL
);

-- Criar Tabela Veiculo

CREATE TABLE Veiculo(
cod_veiculo INTEGER NOT NULL,
tipo_veiculo VARCHAR(20) NOT NULL,
matricula VARCHAR(8) NOT NULL,
marca VARCHAR(20) NOT NULL,
modelo VARCHAR(5) NOT NULL,
nr_apolice INTEGER NOT NULL,
nr_quilometros INTEGER NOT NULL,
CONSTRAINT pk_Veiculo_cod_veiculo_tipo_veiculo PRIMARY KEY(cod_veiculo, tipo_veiculo),
CONSTRAINT fk_Veiculo_tipo_veiculo FOREIGN KEY (tipo_veiculo) REFERENCES TipoVeiculo(tipo_veiculo),
CONSTRAINT ck_Veiculo_matricula CHECK(REGEXP_LIKE(matricula ,'[0-9]{2}-[A-Z]{2}-[0-9]{2}|[0-9]{2}-[0-9]{2}-[A-Z]{2}|[A-Z]{2}-[0-9]{2}-[0-9]{2}'))
);

-- Criar Tabela Funcionario

CREATE TABLE Funcionario(
id_func INTEGER CONSTRAINT pk_Funcionario_id_func PRIMARY KEY,
id_tipo INTEGER NOT NULL,
cod_armazem INTEGER NOT NULL,
cod_supervisor INTEGER NOT NULL,
cc INTEGER NOT NULL CONSTRAINT ck_Funcionario_cc CHECK(REGEXP_LIKE(cc ,'[0-9]{8}-[0-9]{1}-[A-Z]{2}[0-9]{1}')),
nome_func VARCHAR(40) NOT NULL,
morada_func VARCHAR(40) NOT NULL,
nif_func INTEGER NOT NULL UNIQUE CONSTRAINT ck_Funcionario_nif_func CHECK(REGEXP_LIKE(nif_func ,'[0-9]{7}')),
salario_mensal NUMERIC(*,2) NOT NULL,
CONSTRAINT fk_Funcionario_id_tipo FOREIGN KEY (id_tipo) REFERENCES Categoria(id_tipo),
CONSTRAINT fk_Funcionario_cod_armazem FOREIGN KEY (cod_armazem) REFERENCES Armazem(cod_armazem),
CONSTRAINT fk_Funcionario_cod_supervisor FOREIGN KEY (cod_supervisor) REFERENCES Funcionario(id_func)
);

-- Criar Tabela Categoria

CREATE TABLE Categoria(
id_tipo INTEGER CONSTRAINT pk_Categoria_id_tipo PRIMARY KEY,
tipo VARCHAR(20) NOT NULL
);

-- Criar Tabela Viagem


CREATE TABLE Viagem(
nr_viagem INTEGER CONSTRAINT pk_Viagem_nr_viagem PRIMARY KEY,
id_tipo INTEGER NOT NULL,
id_func INTEGER NOT NULL,
cod_veiculo INTEGER NOT NULL,
tipo_veiculo VARCHAR(20) NOT NULL,
data_partida DATE NOT NULL,

CONSTRAINT fk_Viagem_id_tipo FOREIGN KEY (id_tipo) REFERENCES Categoria(id_tipo),
CONSTRAINT fk_Viagem_id_func FOREIGN KEY (id_func) REFERENCES Funcionario(id_func),
CONSTRAINT fk_Viagem_cod_veiculo FOREIGN KEY (cod_veiculo) REFERENCES Veiculo(cod_veiculo),
CONSTRAINT fk_Viagem_tipo_veiculo FOREIGN KEY (tipo_veiculo) REFERENCES TipoVeiculo(tipo_veiculo)
);


-- Criar Tabela Encomenda

CREATE TABLE Encomenda(
id_encomenda INTEGER CONSTRAINT pk_Encomenda_id_encomenda PRIMARY KEY,
cod_armazem INTEGER NOT NULL,
cod_veiculo INTEGER NOT NULL,
nr_viagem INTEGER NOT NULL,
CONSTRAINT fk_Encomenda_nr_viagem FOREIGN KEY (nr_viagem) REFERENCES Viagem(nr_viagem),
id_func INTEGER NOT NULL,
CONSTRAINT fk_Encomenda_cod_armazem FOREIGN KEY (cod_armazem) REFERENCES Armazem(cod_armazem),
CONSTRAINT fk_Encomenda_cod_veiculo FOREIGN KEY (cod_veiculo) REFERENCES Veiculo(cod_veiculo),
CONSTRAINT fk_Encomenda_id_func FOREIGN KEY (id_func) REFERENCES Funcionario(id_func)
);
这是怎么了

CONSTRAINT fk_Viagem_cod_veiculo FOREIGN KEY (cod_veiculo) REFERENCES Veiculo(cod_veiculo)
对于表Viagem,您有一个
外键
,它只引用了
Veiculo(cod\u Veiculo,tipo\u Veiculo)中复合
主键的一部分

对于
Encomenda

CONSTRAINT fk_Encomenda_cod_veiculo FOREIGN KEY(cod_veiculo) REFERENCES Veiculo(cod_veiculo)

修复您的设计,使
外键组合与引用表中的唯一键/主键匹配。

错误消息相当清楚(或至少比某些更好);您有一个外键尝试引用列不会在父表中形成唯一键或主键

Viagem
中,您有:

CONSTRAINT fk_Viagem_cod_veiculo FOREIGN KEY (cod_veiculo) REFERENCES Veiculo(cod_veiculo),
CONSTRAINT fk_Encomenda_cod_veiculo FOREIGN KEY (cod_veiculo) REFERENCES Veiculo(cod_veiculo),
但是
Veiculo
中的主键是两列的组合:

CONSTRAINT pk_Veiculo_cod_veiculo_tipo_veiculo PRIMARY KEY(cod_veiculo, tipo_veiculo),
您不能从该键引用单个列,因为单个列本身不是唯一的,这会导致歧义。因此,显然(但可能是错误的)修复方法是将
Viagem
更改为引用两个列:

CONSTRAINT fk_Viagem_cod_veiculo FOREIGN KEY (cod_veiculo, tipo_veiculo)
  REFERENCES Veiculo(cod_veiculo, tipo_veiculo),
(如果这样做,那么就不需要使用
fk\u Viagem\u tipo\u veiculo
约束,因为
tipo\u veiculo
是fk to
veiculo
的一部分,并且该表已经有了自己的fk to
TipoVeiculo

但是您的
Encomenda
表也有同样的问题;您有:

CONSTRAINT fk_Viagem_cod_veiculo FOREIGN KEY (cod_veiculo) REFERENCES Veiculo(cod_veiculo),
CONSTRAINT fk_Encomenda_cod_veiculo FOREIGN KEY (cod_veiculo) REFERENCES Veiculo(cod_veiculo),
也有。但是对于该表,您没有
id\u tipo
列,因此不能将其包含在FK中

通过一个问题指出了更可能的解决方案-为什么
Veiculo
在其PK中包含
tipo_Veiculo
?看起来
cod_Veiculo
本身应该是唯一的;在这种情况下,将PK更改为:

CONSTRAINT pk_Veiculo_cod_veiculo_tipo_veiculo PRIMARY KEY(cod_veiculo),
并将
Viagem
Encomenda
都保留为您已经拥有的,它们的所有Fk都引用单个列。(尽管您可能想考虑<代码> viaigm < /COD>实际上需要<代码> IDTIOP专栏,因为YUO可以通过< <代码> CODYVEVEROO ……< /P>从<代码> Veiculo < /代码>中获得该代码。
如果你真的想让PK保持原样,那么你必须为
cod\u veiculo
添加一个单独的唯一键,这样才能满足
fk\u Encomenda\u cod\u veiculo
——但这看起来是错误的。

将代码作为文本放在问题中。你的图像太小,无法阅读。我们不知道如何使用“veiculo”和“tipoveiculo”"表看起来很像,所以很难猜出是什么错误。请发布所有创建表语句。顺便说一句,如果列是主键,则无需将其声明为非NULL。错误消息非常清楚,您不能将非唯一的列作为外键引用。如果它们不是
主键
s,则将它们设置为
唯一
@Littlefoot,这是Kaushik刚刚说了什么不对,看看他的答案。