Строка сценария mysql отказывается выполняться (без ошибок / предупреждений) - PullRequest
0 голосов
/ 05 октября 2011

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

Когда я запускаю скрипт, все выполняется, кроме строки 494:

UPDATE `database`.`holding` 
SET `rcnt_rslts`=TRUE 
WHERE `test_rcnt`=TRUE 
  AND (`rcntrslt`='pos' OR `rcntrslt`='neg' OR `rcntrslt`='indeterminate');

rcnt_rslts в обеих таблицах равно BOOL / TINYINT(1), а строки над ниже почти идентичны и выполняются просто отлично. Других ссылок на rcnt_rslts в скрипте больше нет (проверено с помощью команды find / replace).

Если я пройду эту линию прямо в CMI, это сработает.

Есть ли предел строки / размера, и mysql просто случайно выбрал строку, которую нужно игнорировать?

edit : если это имеет значение, все значения в rcnt_rslts равны NULL после запуска сценария.

1 Ответ

1 голос
/ 05 октября 2011

ОК, я попробую:

1- Возможно, вы сделали опечатку в rcntrslt, сделайте это так, и вы перечислите ее только один раз.

UPDATE `database`.holding 
SET rcnt_rslts=TRUE 
WHERE test_rcnt=TRUE 
  AND (rcntrslt IN ('pos','neg','indeterminate'));

2- = может быть чувствительным к регистру, LIKE никогда не бывает, попробуйте:

UPDATE `database`.holding 
SET rcnt_rslts=TRUE 
WHERE test_rcnt=TRUE 
  AND (rcntrslt LIKE 'pos' OR rcntrslt LIKE 'neg' OR rcntrslt LIKE 'indeterminate');

3 - Какие еще значения может иметь rcntrslt, вы не можете отменить все тесты?

UPDATE `database`.holding 
SET rcnt_rslts = TRUE 
WHERE test_rcnt<>FALSE AND test_rcnt IS NOT NULL 
  AND (rcntrslt NOT IN ('othervalue','test1','gdsd')
  AND rcntrslt IS NOT NULL;

4- Возможно, в rcntrslt есть некоторое загрязнение, приводящее к появлению пробелов или других непечатаемых символов.

UPDATE `database`.holding 
SET rcnt_rslts=TRUE 
WHERE test_rcnt=TRUE 
  AND (rcntrslt LIKE '%pos%' OR rcntrslt LIKE '%neg%' 
       OR rcntrslt LIKE '%indeterminate%');

5- Если вы хотите выполнить отладку, вы всегда можете выполнить некоторые диагностические ВЫБОРЫ, чтобы увидеть, что происходит.

CREATE TABLE log (
  id integer auto_increment not null primary key,
  logtime timestamp,
  reason varchar(255) not null,
  tablename varchar(255) not null,
  fieldnames varchar(10000) not null,
  values varchar(10000) not null,
  INDEX log_time (logtime),
  INDEX log_table (tablename),
  INDEX log_reason (tablename, reason)) ENGINE = InnoDB;

INSERT INTO log (reason, tablename, fieldnames, values)
  SELECT 
    'all values','holding', 'test_rcnt,rcntrslt'
    , CONCAT(IFNULL(test_rcnt,'NULL'), ',' ,IFNULL(rcntrslt,'NULL')
  FROM holding;

INSERT INTO log (reason, tablename, fieldnames, values)
  SELECT 
    'test_rcnt = TRUE','holding', 'test_rcnt,rcntrslt'
    , CONCAT(IFNULL(test_rcnt,'NULL'), ',' ,IFNULL(rcntrslt,'NULL')
  FROM holding 
  WHERE test_rcnt = TRUE;

и т. Д.

Теперь проверьте журнал, чтобы увидеть, что не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...