[ Foro de SQL (y MySQL) ]

error foreign key

02-Mar-2018 15:46
Gustavo Sabo
1 Respuestas

Hola como les va?

luego de hacer un diagrama DER en Workbench, lo exporto a script y lo pego en Myphpadmin, pero me da error en una de las tablas (#1005 - No puedo crear tabla `farmasalud`.`obrasocial` (Error: 150 "Foreign key constraint is incorrectly formed") Teoricamente se refiere a que hay una foreign key mal formada, pero no encuentro el problema.
________________________________________________________________
-------------------------------------------------------------------------------------------
-- MySQL Script generated by MySQL Workbench
-- Fri Mar  2 11:27: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 farmasalud
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema farmasalud
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `farmasalud` DEFAULT CHARACTER SET utf8 ;
USE `farmasalud` ;

-- -----------------------------------------------------
-- Table `farmasalud`.`Categorías`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `farmasalud`.`Categorías` (
 `CodigoCategoria` INT NOT NULL AUTO_INCREMENT,
 `Categoria` VARCHAR(45) NOT NULL,
 PRIMARY KEY (`CodigoCategoria`))
ENGINE = InnoDB
COMMENT = ' ';


-- -----------------------------------------------------
-- Table `farmasalud`.`Sucursal`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `farmasalud`.`Sucursal` (
 `CodigoSucursal` INT NOT NULL AUTO_INCREMENT,
 `Sucursal` VARCHAR(45) NOT NULL,
 `Localidad` VARCHAR(45) NULL,
 `Calle` VARCHAR(45) NULL,
 `Numero` INT NULL,
 PRIMARY KEY (`CodigoSucursal`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `farmasalud`.`Producto`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `farmasalud`.`Producto` (
 `CodigoProducto` INT NOT NULL,
 `Descripcion` VARCHAR(45) NOT NULL,
 `Marca` VARCHAR(45) NOT NULL,
 `CodigoCategoria` INT NOT NULL,
 `Costo` DECIMAL(9,2) NULL,
 `Precio` DECIMAL(9,2) NULL,
 `CodigoSucursal` INT NOT NULL,
 `Fecha de vencimiento` DATE NULL,
 `Cantidad` INT NOT NULL,
 `Frecuencia` INT NULL,
 PRIMARY KEY (`CodigoProducto`),
 INDEX `categoria_idx` (`CodigoCategoria` ASC),
 INDEX `sucursal_idx` (`CodigoSucursal` ASC),
 CONSTRAINT `categoria`
   FOREIGN KEY (`CodigoCategoria`)
   REFERENCES `farmasalud`.`Categorías` (`CodigoCategoria`)
   ON DELETE NO ACTION
   ON UPDATE NO ACTION,
 CONSTRAINT `sucursal`
   FOREIGN KEY (`CodigoSucursal`)
   REFERENCES `farmasalud`.`Sucursal` (`CodigoSucursal`)
   ON DELETE NO ACTION
   ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `farmasalud`.`Cliente`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `farmasalud`.`Cliente` (
 `CodigoCliente` INT NOT NULL AUTO_INCREMENT,
 `Nombre` VARCHAR(45) NULL,
 `Apellido` VARCHAR(45) NULL,
 `Localidad` VARCHAR(45) NULL,
 `CP` INT NULL,
 `Calle` VARCHAR(45) NULL,
 `Numero` INT NULL,
 `Email` VARCHAR(45) NULL,
 `Telefono` INT NULL,
 PRIMARY KEY (`CodigoCliente`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `farmasalud`.`Empleado`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `farmasalud`.`Empleado` (
 `CodigoEmpleado` INT NOT NULL AUTO_INCREMENT,
 `Nombre` VARCHAR(45) NULL,
 `Apellido` VARCHAR(45) NULL,
 `Localidad` VARCHAR(45) NULL,
 `CP` INT NULL,
 `Calle` VARCHAR(45) NULL,
 `Numero` INT NULL,
 `Email` VARCHAR(45) NULL,
 `Telefono` INT NULL,
 `Login` VARCHAR(45) NULL,
 `Password` VARCHAR(45) NULL,
 PRIMARY KEY (`CodigoEmpleado`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `farmasalud`.`Venta`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `farmasalud`.`Venta` (
 `Nfactura` INT NOT NULL AUTO_INCREMENT,
 `FechaVenta` DATETIME NOT NULL,
 `CodigoCliente` INT NOT NULL,
 `CodigoEmpleado` INT NOT NULL,
 `CodigoSucursal` INT NOT NULL,
 `CodigoProducto` INT NOT NULL,
 `Cantidad` INT NOT NULL,
 `Precio` DECIMAL(9,2) NOT NULL,
 `Importe` DECIMAL(9,2) NOT NULL,
 `Obrasocial` TINYINT NULL,
 `Ncredencial` DOUBLE NULL,
 `Ncae` DOUBLE NOT NULL,
 PRIMARY KEY (`Nfactura`),
 INDEX `cliente_idx` (`CodigoCliente` ASC),
 INDEX `empleado_idx` (`CodigoEmpleado` ASC),
 INDEX `sucursal_idx` (`CodigoSucursal` ASC),
 INDEX `producto_idx` (`CodigoProducto` ASC),
 CONSTRAINT `cliente_cont`
   FOREIGN KEY (`CodigoCliente`)
   REFERENCES `farmasalud`.`Cliente` (`CodigoCliente`)
   ON DELETE NO ACTION
   ON UPDATE NO ACTION,
 CONSTRAINT `empleado_const`
   FOREIGN KEY (`CodigoEmpleado`)
   REFERENCES `farmasalud`.`Empleado` (`CodigoEmpleado`)
   ON DELETE NO ACTION
   ON UPDATE NO ACTION,
 CONSTRAINT `sucursal_const`
   FOREIGN KEY (`CodigoSucursal`)
   REFERENCES `farmasalud`.`Sucursal` (`CodigoSucursal`)
   ON DELETE NO ACTION
   ON UPDATE NO ACTION,
 CONSTRAINT `producto_const`
   FOREIGN KEY (`CodigoProducto`)
   REFERENCES `farmasalud`.`Producto` (`CodigoProducto`)
   ON DELETE NO ACTION
   ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `farmasalud`.`Obrasocial`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `farmasalud`.`Obrasocial` (
 `CodigoRegistroOS` INT NOT NULL AUTO_INCREMENT,
 `Ncredencial` DOUBLE NOT NULL,
 `NombreObrasocial` VARCHAR(45) NOT NULL,
 `CodigoCliente` INT NULL,
 `PorcenDesc` INT NULL,
 `Nfactura` INT NULL,
 `FechaVenta` DATETIME NULL,
 INDEX `fact_idx` (`Ncredencial` ASC, `CodigoCliente` ASC, `Nfactura` ASC),
 PRIMARY KEY (`CodigoRegistroOS`),
 CONSTRAINT `fact_const`
   FOREIGN KEY (`Ncredencial` , `CodigoCliente` , `Nfactura`)
   REFERENCES `farmasalud`.`Venta` (`Ncredencial` , `CodigoCliente` , `Nfactura`)
   ON DELETE NO ACTION
   ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `farmasalud`.`Traza`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `farmasalud`.`Traza` (
 `CodigoRegistroTR` INT NOT NULL AUTO_INCREMENT,
 `Nfactura` INT NOT NULL,
 `FechaVenta` DATETIME NOT NULL,
 `Ntransaccion` DOUBLE NOT NULL,
 PRIMARY KEY (`CodigoRegistroTR`),
 INDEX `traza_idx` (`Nfactura` ASC),
 CONSTRAINT `traza_const`
   FOREIGN KEY (`Nfactura`)
   REFERENCES `farmasalud`.`Venta` (`Nfactura`)
   ON DELETE NO ACTION
   ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `farmasalud`.`Afip`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `farmasalud`.`Afip` (
 `CodigoRegistroAF` INT NOT NULL AUTO_INCREMENT,
 `Nfactura` INT NOT NULL,
 `FechaVenta` DATETIME NOT NULL,
 `Ncae` DOUBLE NOT NULL,
 PRIMARY KEY (`CodigoRegistroAF`),
 INDEX `venta_idx` (`Nfactura` ASC),
 CONSTRAINT `venta_const`
   FOREIGN KEY (`Nfactura`)
   REFERENCES `farmasalud`.`Venta` (`Nfactura`)
   ON DELETE NO ACTION
   ON UPDATE NO ACTION)
ENGINE = InnoDB;


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


Les agradezco mucho, y un saludo!!


14-Mar-2018 00:23
Nacho Cabanes (+83)

En Venta, tu clave primaria tiene sólo un campo, 'NFactura'

Por el contrario, el REFERENCES habla de una clave compuesta, formada por 3 campos.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)