2014-01-23 4 views
1

Я импортирую CSV-файл из ~ 150 тыс. Строк в таблицу 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


Edit:

Ahh - так что я нашел следующую команду в документации 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.


Edit 2:

Ahh - Я на минуту задумался о том, что стоял 'по возрастанию' для, и так как это шестигранной как раз перед этим, я предположил, что это означает "ASCII"

I преобразовал «41636365737363678794964» в ASCII и получил «AccessoryId», так что это было только значение HEX текста, который я пытался импортировать.


Так что ответ:

SHOW ENGINE INNODB STATUS\G 

И найдите раздел под названием: LATEST FOREIGN KEY ERROR

Вы можете получить информацию оттуда. Если кто-то знает лучший или автоматический способ получить эту информацию, я приму это в качестве ответа.

ответ

1

К сожалению, нет лучшего способа получить ошибки внешнего ключа, чем из раздела LATEST FOREIGN KEY ERROR в SHOW ENGINE INNODB STATUS. Информация колонка печатается как, например:

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 Было оценено. –

Смежные вопросы