2014-01-23 34 views
1

我正在將約150k行的CSV文件導入到MySQL(InnoDB)表中。當我收到一個外鍵約束錯誤時,是否有可能「捕捉」MySQL中的無效值?

在導入期間的某個時間點,由於外鍵約束錯誤而導致失敗。

它顯示了故障上發生的這列:

Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails 
(`db`.`table`, CONSTRAINT `fk` FOREIGN KEY (`otherTableId`) REFERENCES `otherTable` 
(`otherTableId`)) 

是否可以「捕捉」那是什麼價值?

我還沒有嘗試過任何東西,因爲我不知道該怎麼嘗試。 :P


編輯:

啊 - 所以我發現下面的命令MySQL文檔中:

SHOW ENGINE INNODB STATUS\G 

我發現從該命令的如下信息:

------------------------ 
LATEST FOREIGN KEY ERROR 
------------------------ 
2014-01-22 16:27:26 2afaf98b8940 Transaction: 
TRANSACTION 85952, ACTIVE 0 sec inserting 
mysql tables in use 1, locked 1 
4 lock struct(s), heap size 376, 1 row lock(s), undo log entries 1 
MySQL thread id 944, OS thread handle 0x2afaf98b8940, query id 66223 System lock 
{{QUERY}} 
Foreign key constraint fails for table {TABLE INFO}: 
, 
    CONSTRAINT `fk` FOREIGN KEY (`Id`) REFERENCES `table` (`id`) 
Trying to add in child table, in index `fk` tuple: 
DATA TUPLE: 2 fields; 
0: len 11; hex 4163636573736f72794964; asc AccessoryId;; 
1: len 4; hex 80000003; asc  ;; 

But in parent table `db`.`table`, in index `PRIMARY`, 
the closest match we can find is record: 
PHYSICAL RECORD: n_fields 5; compact format; info bits 0 
0: len 6; hex 46494c544552; asc FILTER;; 
1: len 6; hex 000000007300; asc  s ;; 
2: len 7; hex fb000001b01476; asc  v;; 
3: len 1; hex 46; asc F;; 
4: len 9; hex 756e646566696e6564; asc undefined;; 

我在找什麼是:

Trying to add in child table, in index `fk` tuple: 
DATA TUPLE: 2 fields; 
0: len 11; hex 4163636573736f72794964; asc AccessoryId;; 
1: len 4; hex 80000003; asc  ;; 

我不知道什麼'asc'在'AccessoryId'之前的含義,但是這讓我發現我並沒有忽略CSV的第一行。


編輯2:

啊 - 我在想着什麼「ASC」主張分鐘,因爲有六角之前,我認爲它的意思是「ASCII」

我將'4163636573736f72794964'轉換爲ASCII並得到「AccessoryId」,所以這就是我試圖導入的文本的HEX值。


所以答案是:

SHOW ENGINE INNODB STATUS\G 

然後搜索標題爲:LATEST FOREIGN KEY ERROR

你可以從那裏得到你的信息。如果有人知道更好或自動獲取這些信息的方式,我會接受它作爲答案。

回答

1

不幸的是,沒有比SHOW ENGINE INNODB STATUS中的LATEST FOREIGN KEY ERROR部分更好的方法來獲得外鍵錯誤。列信息打印爲例如:

Trying to add in child table, in index `fk` tuple: 
DATA TUPLE: 2 fields; 
0: len 11; hex 4163636573736f72794964; asc AccessoryId;; 
1: len 4; hex 80000003; asc  ;; 

這是印刷的全套列的從索引(fk),並且如你猜格式是:

<column index>: 
    len <length of bytes stored>; 
    hex <hex representation of bytes>; 
    asc <ascii representation of bytes>;; 

此外不幸的是,InnoDB的沒有按不太瞭解MySQL的列類型是如何存儲以給出合理的打印表示的,所以一些值有點「奇怪」,例如80000003是存儲整數3(InnoDB內部翻轉高位)的字節的十六進制表示形式。

+0

感謝您的信息。至少我現在知道。 :P有人表示讚賞。 –