为什么MySQL不接受我的外键?
我有26张相互依赖的桌子。我将每个表装箱,然后通过MySQL Workbench在数据库中执行。然后我构建了一个模型,在那里我链接了那些表,创建了外键。我将其导出回元数据,现在我有了表的完整代码以及应用程序创建的正确外部数据,因此我没有犯错误 但是当我把文件放在服务器中由phpMyAdmin运行时,我得到一个150错误,没有指定它在哪里。我用谷歌搜索了它,但每种情况都不同,我的是FK不是自动递增的字段,而是我创建的一个名为UT的字符串字段,它具有我创建行时的时间单位为什么MySQL不接受我的外键?,mysql,foreign-keys,foreign-key-relationship,Mysql,Foreign Keys,Foreign Key Relationship,我有26张相互依赖的桌子。我将每个表装箱,然后通过MySQL Workbench在数据库中执行。然后我构建了一个模型,在那里我链接了那些表,创建了外键。我将其导出回元数据,现在我有了表的完整代码以及应用程序创建的正确外部数据,因此我没有犯错误 但是当我把文件放在服务器中由phpMyAdmin运行时,我得到一个150错误,没有指定它在哪里。我用谷歌搜索了它,但每种情况都不同,我的是FK不是自动递增的字段,而是我创建的一个名为UT的字符串字段,它具有我创建行时的时间单位 CREATE TABLE
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
子句移到外键之前,因为外键不能引用非索引字段。简而言之,外键应该引用候选键列。也就是说,它应该引用声明为
- 主键,或
- 非空唯一
如果需要来自另一个表的非唯一数据,请在查询中联接它,或在视图中联接它。它是外键的主索引。假设“系统不强制要求引用的列是唯一的或声明为非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;