Aquí podría ser tu PUBLICIDAD


Encuentra la fila de MySQL identificada por el número en un mensaje de advertencia

votos
3

El resultado de mostrar advertencias de MySQL identifica filas problemáticas por número. ¿Cuál es la mejor manera de ver rápidamente todos los datos de una fila así?

Por ejemplo, después de ejecutar una updatedeclaración, el resultado indica 1 advertencia y la ejecución show warningsda un mensaje como este: Datos truncados para la columna 'persona' en la fila 65278. ¿Cómo puedo seleccionar exactamente esa fila?

Aquí hay un ejemplo concreto que explora la limitsolución:

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;

Eso resulta en este resultado de advertencia:

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

Para obtener solo esa fila 5, puedo hacer esto:

select * from test1 limit 4,1;

dando como resultado esto:

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

Por lo tanto, parece que el limitdesplazamiento (4) debe ser uno menos que el número de fila, y el número de fila dado en la advertencia es para la tabla fuente de la actualización sin tener en cuenta la wherecláusula.

Publicado el 12/03/2009 a las 19:15
fuente por usuario Fred Yankowski
En otros idiomas...        العربية       

3 respuestas

votos
1

Por lo que sé, la única forma de seleccionar esas filas es simplemente SELECTusar los criterios de su UPDATEconsulta original :

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;

Obviamente, esto no funciona si ha modificado una o más de las columnas que formaban parte de su consulta original.

Respondida el 12/03/2009 a las 07:52
fuente por usuario Can Berk Güder


Aquí podría ser tu PUBLICIDAD


votos
0

No plantear esta cuestión de la muerte, pero voy a añadir un método más de encontrar la fuente de los datos de alerta que puede ser útil en ciertos casos.

Si va a importar un conjunto completo de datos de una tabla a otra y recibe un aviso de truncamiento en un campo específico puede ejecutar una consulta que une las dos tablas en un valor de ID y luego filtrar por los registros en el campo en cuestión no coincide. Obviamente, esto sólo funcionará si está importando de una tabla separada y seguir teniendo acceso a la tabla de origen no modificado.

Así que si el campo en cuestión es testfieldseguido de la consulta de importación se ve así:

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

La consulta de diagnóstico podría ser algo como esto:

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

Esto tiene la ventaja añadida de que el orden de los registros en cualquiera de las tablas no importa.

Respondida el 27/05/2015 a las 06:37
fuente por usuario nextgentech

votos
0

LIMITE x, y devuelve el número de filas después de la fila x, según el orden del conjunto de resultados de su consulta de selección. Sin embargo, si observa detenidamente lo que acabo de decir, notará que sin una cláusula ORDER BY, no tiene forma de garantizar la posición de la (s) fila (s) que intenta obtener.

Es posible que desee agregar un campo de autoincrement a su inserción o quizás un desencadenador que se active antes de cada inserción, luego use ese índice para asegurar el orden de los resultados para limitar por.

Respondida el 18/07/2009 a las 08:24
fuente por usuario Rob Goodyear