2017-02-13 144 views
0

我试图在表Reviewsid的表Sentences的字段review_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:len 36;十六进制37626532323335652d616663392d313165362d383935342d633462333031636466363237; asc 7be2235e-afc9-11e6-8954-c4b301cdf627 ;; ...

+1

不幸的是,当涉及到外键定义错误时,MySQL隐藏了实际的错误信息。您需要运行“SHOW ENGINE INNODB STATUS”并在«最新的外键错误»部分找到它。请注意[显示引擎查询](https://dev.mysql.com/doc/refman/5.7/en/show-engine.html)需要['PROCESS'特权](https://dev.mysql。 com/doc/refman/5.7/en/privileges-provided.html#priv_process),您的普通MySQL用户可能没有 - 您可以分配权限或以root身份运行查询。 –

回答

2

问题听起来像你想添加一个外键与不匹配行。如果是这样,您的首要任务是找到不匹配的行并确定问题的范围换句话说,您有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为空。

+0

是的,你是完全正确的。错误是由于“不匹配”,这对我来说是完全意外的。我会修复这些数据,然后我会再试一次! –

0

试试这个:

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