我不知道为什么在将外键放入MariaDB时出现错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我不知道为什么在将外键放入MariaDB时出现错误相关的知识,希望对你有一定的参考价值。

我不知道为什么在将外键放入MariaDB时出现错误

我删除了完整的数据库(如果存在)

drop database if exists proveedoresCarrito;
create database proveedoresCarrito;
use proveedoresCarrito;

而现在我要创建表格

CREATE TABLE INVENTARIO (
NUMPIEZA CHAR(16) NOT NULL,
NUMBIN SMALLINT NOT NULL,
CANTDISPONIBLE SMALLINT,
FECHARECUENTO DATE,
PERIODORECUEN SMALLINT,
CANTAJUSTE SMALLINT,
CARTREORD SMALLINT,
PUNTOREORD SMALLINT);


CREATE TABLE LINPED (
NUMPEDIDO SMALLINT NOT NULL,
NUMLINEA SMALLINT NOT NULL,
NUMPIEZA CHAR(16),
PRECIOCOMPRA INTEGER,
CANTPEDIDA SMALLINT,
FECHARECEP DATE,
CANTRECIBIDA SMALLINT);


CREATE TABLE PEDIDO (
NUMPEDIDO SMALLINT NOT NULL,
NUMVEND SMALLINT,
FECHA DATE);


CREATE TABLE PIEZA (
NUMPIEZA CHAR(16) NOT NULL,
NOMPIEZA CHAR(30),
PRECIOVENT INTEGER);


CREATE TABLE PRECiosUM (
NUMPIEZA CHAR(16) NOT NULL,
NUMVEND SMALLINT NOT NULL,
PRECIOUNIT INTEGER,
DIASSUM SMALLINT,
DESCUENTO SMALLINT);


CREATE TABLE VENDEDOR (
NUMVEND SMALLINT NOT NULL,
NOMVEND CHAR(30),
NOMBRECOMER CHAR(30),
TELEFONO CHAR(15),
CALLE CHAR(30),
CIUDAD CHAR(20),
PROVINCIA CHAR(20),
COD_POSTAL CHAR(5));

create table usuarios(
nombre SMALLINT NOT NULL,
pass CHAR(15)
);

我设置了主键

ALTER TABLE INVENTARIO ADD CONSTRAINT CP_INVENTARIO PRIMARY KEY (NUMBIN);
ALTER TABLE LINPED ADD CONSTRAINT CP_LINPED PRIMARY KEY (NUMPEDIDO, NUMLINEA);
ALTER TABLE PEDIDO ADD CONSTRAINT CP_PEDIDO PRIMARY KEY (NUMPEDIDO);
ALTER TABLE PIEZA ADD CONSTRAINT CP_PIEZA PRIMARY KEY (NUMPIEZA);
ALTER TABLE PRECIOSUM ADD CONSTRAINT CP_PRECIOSUM PRIMARY KEY (NUMPIEZA, NUMVEND);
ALTER TABLE VENDEDOR ADD CONSTRAINT CP_VENDEDOR PRIMARY KEY (NUMVEND);

最后我设置了外键

ALTER TABLE INVENTARIO ADD CONSTRAINT CP_INVENTARIO PRIMARY KEY (NUMBIN);
ALTER TABLE LINPED ADD CONSTRAINT CP_LINPED PRIMARY KEY (NUMPEDIDO, NUMLINEA);
ALTER TABLE PEDIDO ADD CONSTRAINT CP_PEDIDO PRIMARY KEY (NUMPEDIDO);
ALTER TABLE PIEZA ADD CONSTRAINT CP_PIEZA PRIMARY KEY (NUMPIEZA);
ALTER TABLE PRECIOSUM ADD CONSTRAINT CP_PRECIOSUM PRIMARY KEY (NUMPIEZA, NUMVEND);
ALTER TABLE VENDEDOR ADD CONSTRAINT CP_VENDEDOR PRIMARY KEY (NUMVEND);
ALTER TABLE usuarios ADD CONSTRAINT CA_VENDEDOR_USUARIOS_NOMBRE FOREIGN KEY (nombre) REFERENCES VENDEDOR(NUMVEND);
ALTER TABLE usuarios ADD CONSTRAINT CA_VENDEDOR_USUARIOS_PASS FOREIGN KEY (pass) REFERENCES VENDEDOR(TELEFONO);

但是,除了最后两个,当我运行sql脚本时,所有外键都正常工作我得到此错误:

Error de SQL(1822):无法添加外键constaint。缺少引用表'vendedor'中约束'CA_VENDEDOR_USUARIOS_PASS'的索引

如果我删除最后两个外键,则错误消失

有谁能给我一个解决方案?

答案

仔细查看“设置外键”代码。它再次创建主键(最后两行除外)。

usuarios似乎没有主键。

ALTER TABLE usuarios ADD CONSTRAINT CP_usuarios PRIMARY KEY (nombre);

删除前6行并仅保留这些行

ALTER TABLE usuarios ADD CONSTRAINT CA_VENDEDOR_USUARIOS_NOMBRE
    FOREIGN KEY (nombre)
    REFERENCES VENDEDOR(NUMVEND);
ALTER TABLE usuarios ADD CONSTRAINT CA_VENDEDOR_USUARIOS_PASS
    FOREIGN KEY (pass)
    REFERENCES VENDEDOR(TELEFONO);

此外(这是生成错误的原因),您尝试将外键添加到列VENDEDOR(TELEFONO),该列不是主键,也不具有UNIQUE约束。

根据微软的说法:

外键约束不必仅链接到另一个表中的主键约束;它也可以定义为引用另一个表中UNIQUE约束的列。

见:Create Foreign Key Relationships

在创建外键之前添加它:

ALTER TABLE VENDEDOR ADD CONSTRAINT UX_telefono UNIQUE (TELEFONO);
另一答案

外键必须始终引用主键。

为了引用表VENDEDOR,您应该使用组成其PK的列。在此示例中,为NUMVEND。

如果您需要有关于该做什么的任何建议,我必须知道您对此DB结构的意图。

以上是关于我不知道为什么在将外键放入MariaDB时出现错误的主要内容,如果未能解决你的问题,请参考以下文章

将外键放入表单

Django:如何将外键检查设置为 0

使用此命令时出现错误,我不知道为啥? [复制]

MySQL 无法添加外键约束

为啥在将 bigint 数插入 bigint 列时出现算术溢出错误?

为啥在将命令行图像文件中的参数作为参数传递时出现错误