Найти строку MySQL, указанную по номеру в предупреждающем сообщении - PullRequest
3 голосов
/ 12 марта 2009

Вывод MySQL «show warnings» идентифицирует проблемные строки по номеру. Какой лучший способ быстро просмотреть все данные для такой строки?

Например, после выполнения оператора update результат показывает «1 предупреждение», а выполнение show warnings выдает сообщение, подобное этому: «Данные усечены для столбца« персона »в строке 65278». Как я могу выбрать именно эту строку?

Вот конкретный пример изучения решения limit:

create table test1 (
  id     mediumint,
  value  varchar(2)
);
insert into test1 (id, value) values
  (11, "a"),
  (12, "b"),
  (13, "c"),
  (14, "d"),
  (15, "ee"),
  (16, "ff");
update test1 set value = concat(value, "X") where id % 2 = 1;
show warnings;

Это приводит к выводу этого предупреждения:

+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1265 | Data truncated for column 'value' at row 5 | 
+---------+------+--------------------------------------------+

Чтобы получить только эту строку 5, я могу сделать это:

select * from test1 limit 4,1;

в результате чего:

+------+-------+
| id   | value |
+------+-------+
|   15 | ee    | 
+------+-------+

Похоже, что смещение limit (4) должно быть на единицу меньше номера строки, а номер строки, указанный в предупреждении, относится к исходной таблице обновления без учета условия where.

Ответы [ 3 ]

1 голос
/ 12 марта 2009

Насколько я знаю, единственный способ выбрать эти строки - просто SELECT использовать их, используя критерии из исходного запроса UPDATE:

mysql> UPDATE foo SET bar = "bar" WHERE baz = "baz";
mysql> SHOW WARNINGS;
...
Message: Data truncated for column 'X' at row 420
...
mysql> SELECT * FROM foo WHERE baz = "baz" LIMIT 420,1;

Очевидно, это не сработает, если вы изменили один или несколько столбцов, которые были частью вашего исходного запроса.

0 голосов
/ 27 мая 2015

Не ставить этот вопрос из мертвых, но я добавлю еще один метод поиска источника данных предупреждения, который может быть полезен в определенных случаях.

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

Таким образом, если рассматриваемое поле равно testfield и ваш запрос на импорт выглядит следующим образом:

INSERT INTO newtable (
  id,
  field1,
  field2,
  testfield
)
SELECT
  id,
  field1,
  field2,
  testfield
FROM oldtable;

Диагностический запрос может выглядеть примерно так:

SELECT newtable.testfield, oldtable.testfield
FROM newtable
INNER JOIN oldtable ON newtable.id = oldtable.id
WHERE newtable.testfield != oldtable.testfield;

Это имеет то преимущество, что порядок записей в любой таблице не имеет значения.

0 голосов
/ 18 июля 2009

LIMIT x, y возвращает y количество строк после строки x в зависимости от порядка набора результатов из вашего запроса select. Однако, если вы внимательно посмотрите на то, что я только что сказал, вы заметите, что без предложения ORDER BY у вас нет способа гарантировать положение строк, которые вы пытаетесь получить.

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

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