正向工程mysql外键

时间:2014-10-23 08:39:43

标签: mysql mysql-workbench reverse-engineering

我试图在mysql工作台中设计我的EER图,但我似乎无法做到这一点 我有一对一对多的关系,也改变了外键的名称但无济于事:( 这是来自错误日志

Executing SQL script in server
ERROR: Error 1005: Can't create table 'lagerprogram.werkzeugsätze_gierth' (errno: 150)
SQL Code:
    -- -----------------------------------------------------
    -- Table `lagerprogram`.`werkzeugsätze_gierth`
    -- -----------------------------------------------------
    CREATE TABLE IF NOT EXISTS `lagerprogram`.`werkzeugsätze_gierth` (
      `werkzeugführung` VARCHAR(45) NOT NULL,
      `messerhalter` VARCHAR(45) NOT NULL,
      `zentrierkronen` VARCHAR(45) NOT NULL,
      `spanvorichtung` VARCHAR(45) NOT NULL,
      `werkzeugsatzQ` VARCHAR(45) NOT NULL,
      PRIMARY KEY (`werkzeugführung`, `messerhalter`, `zentrierkronen`, `spanvorichtung`),
      INDEX `fk_werkzeugsätze_gierth_maschinen_idx` (`werkzeugsatzQ` ASC),
      CONSTRAINT `fk_werkzeugsätze_gierth_maschinen`
        FOREIGN KEY (`werkzeugsatzQ`)
        REFERENCES `lagerprogram`.`maschinen` (`werkzeugsatz`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION)
    ENGINE = InnoDB

SQL script execution finished: statements: 6 succeeded, 1 failed

Fetching back view definitions in final form.
Nothing to fetch

这是我的创建声明

CREATE SCHEMA IF NOT EXISTS `lagerprogram` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `lagerprogram` ;

-- -----------------------------------------------------
-- Table `lagerprogram`.`maschinen`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `lagerprogram`.`maschinen` (
  `typ` VARCHAR(50) NOT NULL,
  `werkzeugsatz` VARCHAR(45) NOT NULL,
  `maschinenkörper` VARCHAR(45) NOT NULL,
  `elektrik` VARCHAR(45) NOT NULL,
  `pneumatic` VARCHAR(45) NOT NULL,
  `hydraulik` VARCHAR(45) NOT NULL,
  `kühlvorrichtung` VARCHAR(45) NOT NULL,
  `vorschubeinheit` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`typ`, `werkzeugsatz`, `maschinenkörper`, `elektrik`, `pneumatic`, `hydraulik`, `kühlvorrichtung`, `vorschubeinheit`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `lagerprogram`.`werkzeugsätze_gierth`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `lagerprogram`.`werkzeugsätze_gierth` (
  `werkzeugführung` VARCHAR(45) NOT NULL,
  `messerhalter` VARCHAR(45) NOT NULL,
  `zentrierkronen` VARCHAR(45) NOT NULL,
  `spanvorichtung` VARCHAR(45) NOT NULL,
  `werkzeugsatzQ` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`werkzeugführung`, `messerhalter`, `zentrierkronen`, `spanvorichtung`),
  INDEX `fk_werkzeugsätze_gierth_maschinen_idx` (`werkzeugsatzQ` ASC),
  CONSTRAINT `fk_werkzeugsätze_gierth_maschinen`
    FOREIGN KEY (`werkzeugsatzQ`)
    REFERENCES `lagerprogram`.`maschinen` (`werkzeugsatz`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `lagerprogram`.`werkzeugführungen`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `lagerprogram`.`werkzeugführungen` (
  `länge` INT NULL,
  `wf_komplett` VARCHAR(45) NULL,
  `jahresbedarf` VARCHAR(45) NULL,
  `flansch` VARCHAR(45) NOT NULL,
  `oberteilführung` VARCHAR(45) NOT NULL,
  `flansch_mit_führung` VARCHAR(45) NOT NULL,
  `passfeder` VARCHAR(45) NOT NULL,
  `typQ` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`flansch`, `oberteilführung`, `flansch_mit_führung`, `passfeder`),
  INDEX `fk_werkzeugführungen_werkzeugsätze_gierth1_idx` (`typQ` ASC),
  CONSTRAINT `fk_werkzeugführungen_werkzeugsätze_gierth1`
    FOREIGN KEY (`typQ`)
    REFERENCES `lagerprogram`.`werkzeugsätze_gierth` (`werkzeugführung`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `lagerprogram`.`flansch`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `lagerprogram`.`flansch` (
  `bestellt` INT NOT NULL,
  `fertigung` INT NULL,
  `lieferant` VARCHAR(50) NULL,
  `lager` INT NULL,
  `lagerplatz` VARCHAR(45) NULL,
  `gewicht` DECIMAL NULL,
  `e_k_preis` DECIMAL NULL,
  `v_k_preis` DECIMAL NULL,
  `flanschQ` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`bestellt`),
  INDEX `fk_flansch_werkzeugführungen1_idx` (`flanschQ` ASC),
  CONSTRAINT `fk_flansch_werkzeugführungen1`
    FOREIGN KEY (`flanschQ`)
    REFERENCES `lagerprogram`.`werkzeugführungen` (`flansch`)
    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;

1 个答案:

答案 0 :(得分:0)

外键中引用的列需要有一个索引。因此,您需要将maschinen表的定义更改为:

CREATE TABLE IF NOT EXISTS `lagerprogram`.`maschinen` (
  `typ` VARCHAR(50) NOT NULL,
  `werkzeugsatz` VARCHAR(45) NOT NULL,
  `maschinenkörper` VARCHAR(45) NOT NULL,
  `elektrik` VARCHAR(45) NOT NULL,
  `pneumatic` VARCHAR(45) NOT NULL,
  `hydraulik` VARCHAR(45) NOT NULL,
  `kühlvorrichtung` VARCHAR(45) NOT NULL,
  `vorschubeinheit` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`typ`, `werkzeugsatz`, `maschinenkörper`, `elektrik`, `pneumatic`, `hydraulik`, `kühlvorrichtung`, `vorschubeinheit`),
  KEY (`werkzeugsatz`))
ENGINE = InnoDB;

或者您可以更改PRIMARY KEY中列的顺序,以便werkzeugsatz成为第一个:

PRIMARY KEY (`werkzeugsatz`, `typ`, `maschinenkörper`, `elektrik`, `pneumatic`, `hydraulik`, `kühlvorrichtung`, `vorschubeinheit`)