【问题标题】:Fail on foreign constraint key外约束键失败
【发布时间】:2017-02-13 09:33:06
【问题描述】:

我正在尝试在表Reviews 中的字段review_id 和表Sentences 中的id 之间创建一个外键。表结构如下:

CREATE TABLE `Reviews` (
  `review_id` varchar(255) CHARACTER SET utf8 NOT NULL,
  `package_name` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `review_content` text CHARACTER SET utf8,
  `review_date` date DEFAULT NULL,
  `star_rating` int(11) DEFAULT NULL,
  `app_version_id` int(11) NOT NULL,
  PRIMARY KEY (`review_id`),
  KEY `app_version_id` (`app_version_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `Sentences` (
  `id` varchar(255) NOT NULL DEFAULT '',
  `review` text,
  `category` varchar(255) DEFAULT NULL,
  `topic` varchar(255) DEFAULT NULL,
  KEY `rev-id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我面临以下错误,我不明白问题可能是什么。

ALTER TABLE `Reviews` ADD CONSTRAINT `rev-to-sents` FOREIGN KEY (`review_id`) REFERENCES `Sentences` (`id`)
Foreign key constraint fails for table `msr test db`.`#sql-75_d`:
,
  CONSTRAINT `rev-to-sents` FOREIGN KEY (`review_id`) REFERENCES `Sentences` (`id`)

尝试在索引 PRIMARY 元组中添加子表: 数据元组:8个字段; 0:长度 36;十六进制 37626532323335652d616663392d313165362d383935342d633462333031636466363237; asc 7be2235e-afc9-11e6-8954-c4b301cdf627;; ...

【问题讨论】:

  • 不幸的是,当涉及到外键定义错误时,MySQL 隐藏了实际的错误消息。您需要运行 SHOW ENGINE INNODB STATUS 并在 «LATEST FOREIGN KEY ERROR» 部分中找到它。请注意,show engine queries 需要 PROCESS privilege,而您的常规 MySQL 用户可能没有 - 您可以分配权限或以 root 身份运行查询。

标签: mysql sql foreign-keys foreign-key-relationship


【解决方案1】:

这个问题听起来像是您试图添加一个外键与不匹配的行。如果是这样,您的首要任务是找到不匹配的行并确定问题的范围。换句话说,您遇到Reviewes.review_idSentences.id 中的任何值都不匹配的情况

您需要先找到并修复您的数据。这意味着:

SELECT review_id FROM Reviews
  LEFT JOIN Sentences ON review_id = Sentences.id
 WHERE Sentences.id IS NULL;

由于您对Sentences.id 有一个NOT NULL 约束,因此只有当连接条件失败时,id 才会为空。

【讨论】:

  • 是的,你完全正确。该错误是由于“不匹配”造成的,这对我来说是完全出乎意料的。我会修复数据,然后再试一次!
【解决方案2】:

试试这个:

ALTER TABLE Reviews
ADD CONSTRAINT rev-to-sents
ADD FOREIGN KEY (review_id)
REFERENCES Sentences (id)

【讨论】:

    猜你喜欢
    • 2013-05-29
    • 2013-03-04
    • 2016-08-17
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 2021-12-04
    相关资源
    最近更新 更多