3 votes

Trouver une ligne MySQL identifiée par un numéro dans un message d'avertissement

La sortie MySQL "show warnings" identifie les lignes problématiques par leur nombre. Quelle est la meilleure façon de voir rapidement toutes les données d'une telle ligne ?

Par exemple, après avoir exécuté un update le résultat indique "1 avertissement" et le lancement de l'application show warnings donne un message comme celui-ci : "Données tronquées pour la colonne 'personne' à la ligne 65278". Comment puis-je sélectionner exactement cette ligne ?

Voici un exemple concret qui explore le limit solution :

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;

Il en résulte ce message d'avertissement :

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

Pour obtenir juste cette rangée 5, je peux faire ça :

select * from test1 limit 4,1;

ce qui se traduit par ceci :

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

Il semble donc que le limit Le décalage (4) doit être inférieur d'une unité au numéro de ligne, et le numéro de ligne indiqué dans l'avertissement est celui de la table source de la mise à jour, sans tenir compte de l'ordre de priorité de la mise à jour. where clause.

1voto

Can Berk Güder Points 39887

Pour autant que je sache, la seule façon de sélectionner ces lignes est de juste SELECT en utilisant les critères de votre UPDATE requête :

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;

Évidemment, cela ne fonctionne pas si vous avez modifié une ou plusieurs des colonnes qui faisaient partie de votre requête d'origine.

0voto

LIMIT x,y renvoie le nombre y de lignes après la ligne x, en fonction de l'ordre du jeu de résultats de votre requête de sélection. Toutefois, si vous examinez attentivement ce que je viens de dire, vous remarquerez que sans clause ORDER BY, vous n'avez aucun moyen de garantir la position de la ou des lignes que vous essayez d'obtenir.

Vous pourriez ajouter un champ d'auto-incrémentation à votre insertion ou peut-être un déclencheur qui se déclenche avant chaque insertion, puis utiliser cet index pour assurer l'ordre des résultats à limiter.

0voto

nextgentech Points 1266

Sans vouloir ressusciter cette question, j'ajouterai une autre méthode pour trouver la source des données d'alerte qui peut être utile dans certains cas.

Si vous importez un ensemble de données complet d'une table vers une autre et que vous recevez un avertissement de troncature sur un champ spécifique, vous pouvez exécuter une requête joignant les deux tables sur une valeur d'identification, puis filtrer les enregistrements pour lesquels le champ en question ne correspond pas. Évidemment, cela ne fonctionne que si vous importez à partir d'une table distincte et que vous avez toujours accès à la table source non modifiée.

Donc, si le champ en question est testfield et votre requête d'importation ressemble à ceci :

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

La requête de diagnostic pourrait ressembler à ceci :

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

Cela présente l'avantage supplémentaire que l'ordre des enregistrements dans l'une ou l'autre table n'a pas d'importance.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X