2

我有 26 个相互依赖的表。我创建了每个表,然后通过MySQL Workbench. 然后我建立模型,在其中链接那些创建外键的表。我将其导出回元数据,现在我拥有了包含应用程序创建的正确外部数据的表的完整代码,所以我没有犯错。

但是当我将文件放在我的服务器中以由 phpMyAdmin 运行时,我收到一个 150 错误,它没有指定它的位置。我用谷歌搜索了它,但每种情况都不同,我的是 FK 不是自动递增字段,而是我创建的一个名为 UT 的字符串字段,它在我创建一行时具有时间单位。

CREATE  TABLE IF NOT EXISTS `eduardo8_plataforma`.`aplicativo` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT ,
  `ut` VARCHAR(20) NOT NULL ,
  `nome` VARCHAR(99) NOT NULL ,
  `ver` VARCHAR(20) NULL DEFAULT NULL ,
  `descr` VARCHAR(254) NULL DEFAULT NULL ,
  `tag` VARCHAR(254) NULL DEFAULT NULL ,
  `url` VARCHAR(254) NULL DEFAULT NULL ,
  `cad` VARCHAR(20) NULL DEFAULT NULL ,
  `obj` TEXT NULL DEFAULT NULL ,
  `tab` VARCHAR(254) NULL DEFAULT NULL ,
  `dbn` VARCHAR(254) NULL DEFAULT NULL ,
  `dbu` VARCHAR(254) NULL DEFAULT NULL ,
  `dbs` VARCHAR(254) NULL DEFAULT NULL ,
  PRIMARY KEY (`id`) ,
  UNIQUE INDEX `nome` (`nome` ASC) ,
  UNIQUE INDEX `ut_UNIQUE` (`ut` ASC) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_swedish_ci;

CREATE  TABLE IF NOT EXISTS `eduardo8_plataforma`.`modulo` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT ,
  `ut` VARCHAR(20) NOT NULL ,
  `app` VARCHAR(20) NULL DEFAULT NULL ,
  `lic` VARCHAR(20) NULL DEFAULT NULL ,
  `tipo` VARCHAR(20) NULL DEFAULT NULL ,
  `nome` VARCHAR(99) NOT NULL ,
  `classe` VARCHAR(99) NOT NULL ,
  `obj` TEXT NULL DEFAULT NULL ,
  PRIMARY KEY (`id`) ,
  UNIQUE INDEX `ut_UNIQUE` (`ut` ASC) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_swedish_ci;

CREATE  TABLE IF NOT EXISTS `eduardo8_plataforma`.`modulo_app` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT ,
  `ut` VARCHAR(20) NOT NULL ,
  `app` VARCHAR(20) NOT NULL ,
  `modulo` VARCHAR(20) NOT NULL ,
  PRIMARY KEY (`id`) ,
  INDEX `fk_modulo_app_modulo1` (`modulo` ASC) ,
  INDEX `fk_modulo_app_aplicativo1` (`app` ASC) ,
  UNIQUE INDEX `ut_UNIQUE` (`ut` ASC) ,
  CONSTRAINT `fk_modulo_app_modulo1`
    FOREIGN KEY (`modulo` )
    REFERENCES `eduardo8_plataforma`.`modulo` (`ut` )
    ON DELETE CASCADE
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_modulo_app_aplicativo1`
    FOREIGN KEY (`app` )
    REFERENCES `eduardo8_plataforma`.`aplicativo` (`ut` )
    ON DELETE CASCADE
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_swedish_ci;

有效的表(在答案之后):

CREATE  TABLE IF NOT EXISTS `eduardo8_plataforma`.`modulo_app` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT ,
  `ut` VARCHAR(20) CHARACTER SET 'utf8' COLLATE 'utf8_swedish_ci' UNIQUE NOT NULL ,
  `app` VARCHAR(20) CHARACTER SET 'utf8' COLLATE 'utf8_swedish_ci' NOT NULL ,
  `modulo` VARCHAR(20) CHARACTER SET 'utf8' COLLATE 'utf8_swedish_ci' NOT NULL ,
  PRIMARY KEY (`id`) ,
  INDEX `fk_modulo_app_modulo1` (`modulo` ASC) ,
  INDEX `fk_modulo_app_aplicativo1` (`app` ASC) ,
  UNIQUE INDEX `ut_UNIQUE` (`ut` ASC) ,
  CONSTRAINT `fk_modulo_app_modulo1`
    FOREIGN KEY (`modulo` )
    REFERENCES `eduardo8_plataforma`.`modulo` (`ut` )
    ON DELETE CASCADE
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_modulo_app_aplicativo1`
    FOREIGN KEY (`app` )
    REFERENCES `eduardo8_plataforma`.`aplicativo` (`ut` )
    ON DELETE CASCADE
    ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_swedish_ci;
4

2 回答 2

4

您需要将CREATE INDEX子句移到外键之前,因为外键不能引用非索引字段。

于 2013-09-16T13:45:53.327 回答
2

简短的故事是外键应该引用候选键列。也就是说,它应该引用一个声明的列

  • 主键,或
  • 非空唯一。

如果您引用不唯一的列,标准 SQL dbms 将引发错误。MySQL 也应该,但它不会。

Mysql Docs

. . . 系统不强制要求引用的列是唯一的或声明为 NOT NULL。对于 UPDATE 或 DELETE CASCADE 等操作,对非唯一键或包含 NULL 值的键的外键引用的处理没有明确定义。建议您使用仅引用 UNIQUE(包括 PRIMARY)和 NOT NULL 键的外键。

如果您需要来自另一个表的非唯一数据,请将其连接到查询中,或将其连接到视图中。

于 2013-09-16T13:48:26.693 回答