2015-04-01 92 views
0

我一般是新的MySQL和數據庫。我的任務是手動將舊數據庫移動到一個稍有不同格式的新數據庫。挑戰包括將某個數據庫中某個表的某些列轉移到另一個具有相似格式的數據庫。由於源數據庫是MyISAM,目標是InnoDB,因此這會變得更加困難。MySQL的「不能添加或更新子行,外鍵約束失敗」

所以我有兩個數據庫,一個是源和B爲目標,並在嘗試「最」的表格複製到類似的表在目標數據庫中。
這裏是我運行命令:

INSERT INTO B.article (id, ticket_id, article_type_id, 
    article_sender_type_id, a_from, a_reply_to, a_to, a_cc, a_subject, 
    a_message_id, a_in_reply_to, a_references, a_content_type, a_body, 
    incoming_time, content_path, valid_id, create_time, create_by,change_time, 
    change_by) 
SELECT id, ticket_id, article_type_id, article_sender_type_id, 
    a_from, a_reply_to, a_to, a_cc, a_subject, a_message_id, a_in_reply_to, 
    a_references, a_content_type, a_body, incoming_time, content_path, 
    valid_id, create_time, create_by, change_time, change_by 
FROM A.article 
WHERE id NOT IN (1); 

錯誤:

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`helpdesk`.`article`, CONSTRAINT `FK_article_ticket_id_id` FOREIGN KEY (`ticket_id`) REFERENCES `ticket` (`id`)) 

之所以提出命令這麼羅嗦是源有是不必要的,因此被修剪掉的幾列目的地表。 WHERE id NOT IN(1)在那裏,這樣第一行就不會被複制(它在兩個數據庫中都被初始化,如果兩個數據庫都有相同的'id'字段,MySQL會拋出一個錯誤)。如果預計'ticket_id'在行之間是唯一的,我不能告訴錯誤,如果它認爲'ticket_id'在行之間是唯一的,或者它聲稱一行沒有ticket_id,所以不能被複制,這是錯誤看起來是什麼最常被生成的。

我可以張貼有問題的表,如果這將有助於回答,但我不確定這樣做的最好辦法,所以在正確的方向指向一些會有有幫助。

帖子我看了看面前:

對於formingcommand

對於looking在這個error

謝謝!

回答

0

你會想你的目標表運行SHOW CREATE TABLE

SHOW CREATE TABLE `B`.`article`; 

這可能會告訴你,有在桌子上,這需要一個值在另一個表之前它可以存在foreign key被添加到這一個。具體而言,從您的錯誤看來,字段ticket_id引用ticket表中的id字段。這在首先需要遷移的東西方面引入了一些複雜性 - 必須在引用表(article)之前填充參考表(ticket)。

不知道更多關於你的表,我的猜測是,你有沒有在ticket表遷移着呢,它是空的。在填寫B之前,您需要這樣做。 article表。也有可能您的數據已損壞,您需要查找您嘗試發送的article數據中存在哪個票證ID,但是ticket表中沒有。

另一種方法是turn off foreign key checks,但如果可能的話我會避免這種情況,因爲外鍵的目的是爲了保證數據的完整性。

+0

很確定就是這樣!感謝您指出了這一點。 – Michael 2015-04-02 11:57:40

+0

感謝您關閉外鍵檢查。有些交織的條目除非我這樣做才能添加,我可能會爲整個數據庫做這件事。 – Michael 2015-04-03 20:02:05

相關問題