【问题标题】:Why does this error appear me on sql developer为什么这个错误出现在我的 sql developer
【发布时间】:2018-11-10 16:14:35
【问题描述】:

我创建了“Funcionario”表 然后是“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)
);

【问题讨论】:

  • 将代码作为文本放入问题中。您的图片太小,无法阅读。
  • 我们不知道“veiculo”和“tipoveiculo”表的外观,所以 - 很难猜出哪里出了问题。发布所有 CREATE TABLE 语句。顺便说一句,如果它是主键,则无需声明列 NOT NULL。
  • 错误信息很清楚,不能将非唯一的列作为外键引用。如果它们不是PRIMARY KEYs,则将它们设为UNIQUE
  • @Littlefoot 来了
  • Kaushik 刚刚说出了什么问题;看看他的回答。

标签: sql oracle create-table


【解决方案1】:

这是怎么回事

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

对于 Viagem 表,您有这个 FOREIGN KEY,它仅指 Veiculo (cod_veiculo, tipo_veiculo) 中复合 PRIMARY KEY 的一部分

Encomenda 也一样

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

修复您的设计,使FOREIGN KEY 组合匹配与引用表中的UNIQUE KEY/PRIMARY KEY

【讨论】:

    【解决方案2】:

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

    Viagem 你有:

    CONSTRAINT fk_Viagem_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_Viagem_tipo_veiculo 约束,因为tipo_veiculoVeiculo 的FK 的一部分,并且该表已经有自己的TipoVeiculo 的FK。 )

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

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

    那里也是。但是对于该表,您没有 id_tipo 列,因此您不能将其包含在 FK 中。

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

    CONSTRAINT pk_Veiculo_cod_veiculo_tipo_veiculo PRIMARY KEY(cod_veiculo),
    

    并保留 ViagemEncomenda 就像你已经拥有它们一样,它们的所有 Fk 都引用一个列。 (尽管您可能想考虑Viagem 是否真的需要id_tipo 列,因为您可以通过链接的VeiculoVeiculo 获得它...)

    如果您真的想保持 PK 的原样,那么您将不得不为 cod_veiculo 添加一个单独的唯一密钥,这将满足 fk_Encomenda_cod_veiculo - 但这看起来是错误的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2020-02-03
      相关资源
      最近更新 更多