我正在尝试在两个现有表之间设置外键关系,但由于某种原因我错过了,我不断收到此错误 1215。
两个表的相关字段为:
CREATE TABLE `approvals` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_contract` int(11) NOT NULL,
`id_user` int(11) NOT NULL,
`lang` varchar(8) NOT NULL,
`request_ts` datetime NOT NULL,
`version` int(11) NOT NULL,
-- more nullable columns here with no indexing/relationships
PRIMARY KEY (`id`),
KEY `approval_id_user` (`id_user`),
KEY `version` (`version`,`lang`,`id_contract`),
CONSTRAINT `approval_id_user` FOREIGN KEY (`id_user`)
REFERENCES `users` (`iduser`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1079 DEFAULT CHARSET=utf8
CREATE TABLE `version` (
`idversion` int(11) NOT NULL,
`idcontract` int(11) NOT NULL,
`language` varchar(8) NOT NULL,
PRIMARY KEY (`idversion`,`idcontract`,`language`),
KEY `fk_version_contracts_idx` (`idcontract`),
CONSTRAINT `fk_kidversion_contracts` FOREIGN KEY (`idcontract`)
REFERENCES `contracts` (`id_contract`)
ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8
我尝试了什么
我检查的第一件事是持久性:
SELECT * FROM approvals a
WHERE NOT EXISTS (
SELECT 1 FROM version v
WHERE v.idcontract = a.id_contract AND v.language = a.lang
AND v.idversion = a.version);
这导致 701 中返回 0 行,好吧,从数据 pov 来看我的数据库应该很好。
所以我检查了排序规则,由于某种原因,版本表是 latin1 与 utf8_generic_ci,好的,所以我用这个将版本表恢复为 utf8。
ALTER TABLE `kidversion`
COLLATE = utf8_general_ci;
-- and for good measure
ALTER TABLE `kidversion`
CHANGE COLUMN `language` `language` VARCHAR(8)
CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' NOT NULL;
但此时我在尝试创建外键时仍然遇到错误:
ALTER TABLE `approvals`
ADD CONSTRAINT `approval_ibfk_1`
FOREIGN KEY (`version` , `lang` , `id_contract`)
REFERENCES `version` (`idversion` , `language` , `idcontract`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
我所做的每一步都会得到 1215 分。我肯定错过了一些东西......任何人都可以帮我解决这个问题吗?
最佳答案
外键(版本
、lang
、id_contract
)引用版本
(idversion
>、语言
、idcontract
)和主键(idversion
、idcontract
、语言
)不匹配的字段必须具有相同的顺序和相同的类型。
“在引用表中,必须有一个索引,其中外键列按相同顺序列为第一列。” -https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html
关于mysql - 添加外键时出现错误 1215。帮助我解决我没有尝试过的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58608069/