2017-02-13 131 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)