【问题标题】:Forward engineering mysql Foreign key正向工程mysql外键
【发布时间】:2014-12-18 21:30:21
【问题描述】:

我试图在 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;

【问题讨论】:

  • 您是否先创建了maschinen 表?
  • @Barmar 是的,我现在也发布了创建声明

标签: mysql mysql-workbench reverse-engineering


【解决方案1】:

外键引用的列需要有索引。所以需要将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`)

【讨论】:

  • 它就像一个魅力!但是我没看懂? :( 是因为它引用了 wekzeugsatz ,这就是为什么它必须首先创建?
  • 只有复合键中的第一列有自己的索引,其余的都是嵌套的。
猜你喜欢
  • 2020-07-12
  • 2014-12-19
  • 2014-12-20
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 2016-09-25
相关资源
最近更新 更多