Mysql 无法添加外键约束,我可以';我找不到错误

Mysql 无法添加外键约束,我可以';我找不到错误,mysql,foreign-keys,Mysql,Foreign Keys,我只是从这个开始,但当我将文件导入sql以开始填充所有信息时,它显示了上面的错误,我知道它是给定的,因为它的长度或类型不同,所以我尝试在平面代码或工作台上查找它,但我找不到它。有什么想法吗? 我会非常感谢你的帮助 -- MySQL Script generated by MySQL Workbench -- Tue Apr 3 18:56:56 2018 -- Model: New Model Version: 1.0 -- MySQL Workbench Forward

我只是从这个开始,但当我将文件导入sql以开始填充所有信息时,它显示了上面的错误,我知道它是给定的,因为它的长度或类型不同,所以我尝试在平面代码或工作台上查找它,但我找不到它。有什么想法吗? 我会非常感谢你的帮助

-- MySQL Script generated by MySQL Workbench
    -- Tue Apr  3 18:56:56 2018
    -- Model: New Model    Version: 1.0
-- MySQL Workbench Forward Engineering

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

-- -----------------------------------------------------
-- Schema dhl_dummy
-- -----------------------------------------------------
-- Presentación DHL para importar a Microsoft BI.

-- -----------------------------------------------------
-- Schema dhl_dummy
--
-- Presentación DHL para importar a Microsoft BI.
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `dhl_dummy` DEFAULT CHARACTER SET latin1 COLLATE latin1_spanish_ci ;
USE `dhl_dummy` ;

-- -----------------------------------------------------
-- Table `dhl_dummy`.`Proveedor`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `dhl_dummy`.`Proveedor` (
  `Clave_Prov` INT NOT NULL,
  `Nombre` VARCHAR(45) NOT NULL,
  `Telefono` VARCHAR(15) NOT NULL,
  `CalleyNum` VARCHAR(60) NULL,
  `Colonia` VARCHAR(45) NULL,
  `Ciudad` VARCHAR(45) NOT NULL,
  `Estado` VARCHAR(45) NOT NULL,
  `CP` INT NULL,
  PRIMARY KEY (`Clave_Prov`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `dhl_dummy`.`PT`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `dhl_dummy`.`PT` (
  `Num_art` INT NOT NULL,
  `stock_PT` INT NOT NULL,
  `Nombre` VARCHAR(45) NOT NULL,
  `Precio` DECIMAL(10,2) NOT NULL,
  `Prec_pub` DECIMAL(10,2) NOT NULL,
  PRIMARY KEY (`Num_art`, `stock_PT`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `dhl_dummy`.`Empleado`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `dhl_dummy`.`Empleado` (
  `idEmpleado` INT NOT NULL,
  `Nombre` VARCHAR(35) NOT NULL,
  `Apellidos` VARCHAR(60) NOT NULL,
  `CalleyNum` VARCHAR(60) NOT NULL,
  `Colonia` VARCHAR(30) NOT NULL,
  `Ciudad` VARCHAR(45) NOT NULL,
  `Estado` VARCHAR(20) NOT NULL,
  `CP` INT NOT NULL,
  `Salario` DECIMAL(10,2) NOT NULL,
  `Telefono` INT NULL,
  `id_depto` INT NOT NULL,
  PRIMARY KEY (`idEmpleado`, `id_depto`),
  INDEX `id_depto_idx` (`id_depto` ASC),
  CONSTRAINT `id_depto`
    FOREIGN KEY (`id_depto`)
    REFERENCES `dhl_dummy`.`Departamento` (`idDepartamento`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `dhl_dummy`.`Departamento`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `dhl_dummy`.`Departamento` (
  `idDepartamento` INT NOT NULL,
  `Area` VARCHAR(45) NOT NULL,
  `id_emp` INT NOT NULL,
  PRIMARY KEY (`idDepartamento`, `id_emp`),
  INDEX `Id_empleado_idx` (`id_emp` ASC),
  CONSTRAINT `Id_empleado`
    FOREIGN KEY (`id_emp`)
    REFERENCES `dhl_dummy`.`Empleado` (`idEmpleado`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `dhl_dummy`.`Proporciona`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `dhl_dummy`.`Proporciona` (
  `Clave_Prov` INT NOT NULL,
  `Num_Art` INT NOT NULL,
  `Precio_proy` DECIMAL(10,2) NOT NULL,
  `cantidad` INT NOT NULL,
  PRIMARY KEY (`Clave_Prov`, `Num_Art`),
  CONSTRAINT `Clav_prov`
    FOREIGN KEY (`Clave_Prov`)
    REFERENCES `dhl_dummy`.`Proveedor` (`Clave_Prov`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `dhl_dummy`.`Insumo`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `dhl_dummy`.`Insumo` (
  `idInsumo` INT NOT NULL,
  `Nombre` VARCHAR(30) NOT NULL,
  `fecha_ingreso` DATE NOT NULL,
  `fecha_exp` DATE NOT NULL,
  `stock_insumo` INT NOT NULL,
  PRIMARY KEY (`idInsumo`, `fecha_ingreso`, `fecha_exp`, `stock_insumo`),
  CONSTRAINT `Num_Art`
    FOREIGN KEY (`idInsumo`)
    REFERENCES `dhl_dummy`.`Proporciona` (`Num_Art`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `dhl_dummy`.`Re_stock_insumo`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `dhl_dummy`.`Re_stock_insumo` (
  `Num_pedido` INT NOT NULL,
  `id_Insumo` INT NOT NULL,
  `cant_actual` INT NOT NULL,
  `Fecha_pedido` DATETIME NOT NULL,
  `Cantidad` INT NOT NULL,
  `fecha_llegada` DATE NOT NULL,
  PRIMARY KEY (`Num_pedido`, `id_Insumo`, `cant_actual`),
  INDEX `stock_actual_f_Insum_idx` (`cant_actual` ASC),
  CONSTRAINT `idInsumo`
    FOREIGN KEY (`id_Insumo`)
    REFERENCES `dhl_dummy`.`Insumo` (`idInsumo`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `Num_art`
    FOREIGN KEY (`id_Insumo`)
    REFERENCES `dhl_dummy`.`PT` (`Num_art`)
    ON DELETE NO ACTION
    ON UPDATE CASCADE,
  CONSTRAINT `stock_actual_f_Insum`
    FOREIGN KEY (`cant_actual`)
    REFERENCES `dhl_dummy`.`Insumo` (`stock_insumo`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `dhl_dummy`.`Inventario`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `dhl_dummy`.`Inventario` (
  `Ubicacion` VARCHAR(40) NOT NULL,
  `Refrigeracion` TINYINT NOT NULL,
  `id_f_art` INT NOT NULL,
  `id_f_insumo` INT NOT NULL,
  `stock` INT NOT NULL,
  PRIMARY KEY (`Ubicacion`, `id_f_art`, `id_f_insumo`),
  INDEX `id_f_art_idx` (`id_f_art` ASC),
  INDEX `id_f_insumo_idx` (`id_f_insumo` ASC),
  INDEX `stock_f_inv_insum_idx` (`stock` ASC),
  CONSTRAINT `id_f_art`
    FOREIGN KEY (`id_f_art`)
    REFERENCES `dhl_dummy`.`PT` (`Num_art`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `id_f_insumo`
    FOREIGN KEY (`id_f_insumo`)
    REFERENCES `dhl_dummy`.`Insumo` (`idInsumo`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `stock_f_inv_insum`
    FOREIGN KEY (`stock`)
    REFERENCES `dhl_dummy`.`Insumo` (`stock_insumo`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `stock_f_inv_PT`
    FOREIGN KEY (`stock`)
    REFERENCES `dhl_dummy`.`PT` (`stock_PT`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `dhl_dummy`.`Re_stock_cliente`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `dhl_dummy`.`Re_stock_cliente` (
  `id_pedido` INT NOT NULL AUTO_INCREMENT,
  `cliente_pedido` INT NOT NULL,
  `art_pedido` INT NOT NULL,
  `fecha_pedido` DATETIME(6) NOT NULL,
  `ETA` DATETIME(6) NOT NULL,
  PRIMARY KEY (`id_pedido`, `cliente_pedido`, `fecha_pedido`, `ETA`),
  INDEX `cliente_pedido_f_idx` (`cliente_pedido` ASC),
  INDEX `art_ordenado_idx` (`art_pedido` ASC),
  INDEX `fecha_client_idx` (`fecha_pedido` ASC),
  CONSTRAINT `cliente_pedido_f`
    FOREIGN KEY (`cliente_pedido`)
    REFERENCES `dhl_dummy`.`Cliente` (`idCliente`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `art_ordenado`
    FOREIGN KEY (`art_pedido`)
    REFERENCES `dhl_dummy`.`PT` (`Num_art`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `fecha_client`
    FOREIGN KEY (`fecha_pedido`)
    REFERENCES `dhl_dummy`.`Cliente` (`fecha_pedido`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `dhl_dummy`.`Cliente`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `dhl_dummy`.`Cliente` (
  `idCliente` INT NOT NULL,
  `Nombre` VARCHAR(45) NOT NULL,
  `Direccion` VARCHAR(45) NOT NULL,
  `Telefono` VARCHAR(45) NULL,
  `Pedido_arts` INT NOT NULL,
  `fecha_pedido` DATETIME(6) NOT NULL,
  `fecha_ETA` DATETIME(6) NOT NULL,
  PRIMARY KEY (`idCliente`, `fecha_pedido`, `fecha_ETA`),
  INDEX `art_faltante_f_idx` (`Pedido_arts` ASC),
  INDEX `ETA_producto_idx` (`fecha_ETA` ASC),
  CONSTRAINT `art_faltante_f`
    FOREIGN KEY (`Pedido_arts`)
    REFERENCES `dhl_dummy`.`Re_stock_cliente` (`art_pedido`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `ETA_producto`
    FOREIGN KEY (`fecha_ETA`)
    REFERENCES `dhl_dummy`.`Re_stock_cliente` (`ETA`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

我测试了您的脚本,发现无法创建表
Insumo

然后我运行了
SHOW ENGINE INNODB STATUS
,以获取有关外键故障原因的更详细信息:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
2018-04-03 18:22:32 70000df33000 Error in foreign key constraint of table dhl_dummy/insumo:

    FOREIGN KEY (`idInsumo`)
    REFERENCES `dhl_dummy`.`Proporciona` (`Num_Art`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB:
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
读最后一句话

创建外键时,必须匹配所引用表中主键的所有列。如果被引用表的主键中有两列,则外键必须有两列

在本例中,您尝试在一列
idisumo
上创建一个外键,引用另一个表主键的第二列

FOREIGN KEY (`idInsumo`)
REFERENCES `dhl_dummy`.`Proporciona` (`Num_Art`)
但是,
Propociona
的主键是两列:

PRIMARY KEY (`Clave_Prov`, `Num_Art`),

您不应该创建引用部分主键的外键

FOREIGN KEY (`idInsumo`)
REFERENCES `dhl_dummy`.`Proporciona` (`Num_Art`)

我没有进一步测试,但是我查看了后面的表定义,我发现在其他几个表中也有类似的错误。您试图从与它们引用的表的整个主键不匹配的列中生成外键。

错误消息是什么?错误消息是什么?您是否尝试单独运行每条语句以查看哪条语句会给您带来错误?错误1215(HY000),我如何逐一运行它,以便我可以尝试并找出它的行或语句。请通过编辑您的帖子而不是通过评论来澄清。这也是一个常见问题:1。谷歌搜索错误信息2。用谷歌搜索你的问题。总是用谷歌搜索你的问题/问题/目标的许多清晰、简洁和具体的版本/措辞,并阅读许多答案。将发现的相关关键字添加到搜索中。如果你找不到答案,就发布,使用一种变体搜索你的标题和标签的关键词。此外,代码问题还需要一个。在这里可以找到问题代码&去掉所有不需要的行。另外,您的描述也不清楚。非常感谢您的记录,当我得到一个错误,我需要找到它,所以我运行命令。显示引擎INNODB状态。所以我应该只使用“clave_Prov”,而另一个只是一个参考,对吗?。非常感谢你的帮助。如果引用的主键有两列,则外键也必须有两列。“您不应该创建引用该主键一部分的外键”——无论“不应该”的意思是什么——在特定上下文中可能是真的,但您没有给出它,也没有给出声明FKs的实际相关限制。正是这种不清楚(误导)的表达,才是人们最初感到困惑的部分原因。SQL FK可以引用SQL PK的一部分,这里的错误是引用的列表没有声明为唯一&非空(通过PK或unique not null),并且没有与引用列表相同的长度。@philipxy:在标准SQL中,外键必须引用主键或唯一键,并且必须引用整个键。这是唯一有意义的事情。但InnoDB有一种奇怪的非标准行为,即FK可能引用部分唯一密钥,也可能引用非唯一密钥。这毫无意义,因为它会导致子行引用父表中的多行的奇怪情况,并导致有关引用完整性如何工作的未回答问题。所以为了避免这些奇怪的情况,我们不应该这样做!只需在标准SQL中定义FK。我指的是在SQL标准中定义FK。SQL FK必须引用某些SQL UNIQUE NOT NULL或PK的全部。但它仍然可以引用SQL PK的适当子集。SQL UNIQUE NOT NULL&PK是超级键(唯一键)的类似物,而不是CKs的类似物。一个可以在另一个的适当子集或超集上声明。(一个可以是SQL PK,但它不一定是PK/CK的类似物。)因此SQL FK可以引用SQL PK的适当子集(或超集)。您可以说,一个“应该”在良好风格的意义上只定义PK/CK类似物上的SQL PK。。。只是你没这么说。