在警告消息中查找由数字标识的MySQL行

时间:2009-03-12 18:15:26

标签: mysql

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)必须比行号少一个,并且警告中给出的行号是针对更新的源表而不考虑{{1}条款。

3 个答案:

答案 0 :(得分:1)

据我所知,选择这些行的唯一方法是使用原始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;

显然,如果您修改了原始查询中的一个或多个列,则无效。

答案 1 :(得分:0)

LIMIT x,y返回第x行之后的y行数,具体取决于select查询中结果集的顺序。但是,如果仔细观察我刚才所说的内容,你会注意到如果没有ORDER BY子句,你就无法保证你想要得到的行的位置。

您可能希望在插入中添加自动增量字段,或者可能是在每次插入之前触发的触发器,然后使用该索引来确保结果的顺序限制为。

答案 2 :(得分:0)

不要从死里面提出这个问题,但我会再添加一种方法来查找在某些情况下有用的警告数据来源。

如果要将一个完整的数据集从一个表导入另一个表并在特定字段上收到截断警告,则可以运行查询,在ID值上连接两个表,然后根据所涉及字段的记录进行过滤比赛。显然,只有从单独的表导入并仍然可以访问未修改的源表时,这才有效。

因此,如果相关字段为function setMenuHeight() { var height = $(window).outerHeight(false); $('.custom-menu-primary').height(height); } setMenuHeight(); $(window).resize(setMenuHeight); ,您的导入查询如下所示:

testfield

诊断查询可能如下所示:

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

这具有额外的优势,即任一表中记录的顺序无关紧要。