为什么MySQL不接受我的外键?

为什么MySQL不接受我的外键?,mysql,foreign-keys,foreign-key-relationship,Mysql,Foreign Keys,Foreign Key Relationship,我有26张相互依赖的桌子。我将每个表装箱,然后通过MySQL Workbench在数据库中执行。然后我构建了一个模型,在那里我链接了那些表,创建了外键。我将其导出回元数据,现在我有了表的完整代码以及应用程序创建的正确外部数据,因此我没有犯错误 但是当我把文件放在服务器中由phpMyAdmin运行时,我得到一个150错误,没有指定它在哪里。我用谷歌搜索了它,但每种情况都不同,我的是FK不是自动递增的字段,而是我创建的一个名为UT的字符串字段,它具有我创建行时的时间单位 CREATE TABLE

我有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 INDEX
子句移到外键之前,因为外键不能引用非索引字段。

简而言之,外键应该引用候选键列。也就是说,它应该引用声明为

  • 主键,或
  • 非空唯一
如果引用的列不是唯一的,则标准SQL dbms将引发错误。MySQL也应该,但不会

。系统不强制要求引用的列 必须是唯一的或声明为非空。外键的处理 不允许引用非唯一键或包含空值的键 为更新或删除级联等操作定义良好。你是 建议使用仅引用唯一的外键(包括 主)和非空键


如果需要来自另一个表的非唯一数据,请在查询中联接它,或在视图中联接它。

它是外键的主索引。假设“系统不强制要求引用的列是唯一的或声明为非NULL。对于诸如更新或删除级联之类的操作,对非唯一键或包含NULL值的键的外键引用的处理没有很好的定义。建议您使用仅引用唯一的外键(包括主键)和非空键。“我尝试了你在问题中说的方式并更新了代码,但我仍然得到了150个错误代码。编辑你的问题,并包括你尝试过的内容。粘贴实际代码。我如何在表创建或索引创建之后将FK声明放在表声明中?我尝试了你在问题中说的方式并更新了代码,但我仍然忽略了t输入150错误代码。
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;