mysql - 添加外键时出现错误 1215。帮助我解决我没有尝试过的事情

标签 mysql foreign-keys

我正在尝试在两个现有表之间设置外键关系,但由于某种原因我错过了,我不断收到此错误 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 分。我肯定错过了一些东西......任何人都可以帮我解决这个问题吗?

最佳答案

外键(版本langid_contract)引用版本(idversion >、语言idcontract)和主键(idversionidcontract语言 )不匹配的字段必须具有相同的顺序和相同的类型。 “在引用表中,必须有一个索引,其中外键列按相同顺序列为第一列。” -https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

关于mysql - 添加外键时出现错误 1215。帮助我解决我没有尝试过的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58608069/

相关文章:

php - 如何更快地从mysql数据库加载数据?

mysql - 我如何从 MySQL 的每个组中选择第二行

mysql - 在 MySQL 中使用 InnoDB 时,显式定义*每个*外键是否很常见?

mysql - 确定多个 MySQL 表的正确键值

mysql - 在mysql中添加char类型的外键

mysql - 这个 =COUNTIF(Data!B :B, Data!B :B &"") Excel Formula? 的功能是什么

mysql - Rails `where` 时间少于查询

mysql - 外键可以引用非唯一索引吗?

sql - SQL中,如何获取某列排序的前N行?

orm - 将具有两个关系的选择序列化到同一实体