w3schools values update primary entry ejemplo duplicate mysql insert primary-key ignore composite-primary-key

values - Desactivar advertencia de declaración insegura de mysql



on duplicate key update (2)

Estoy usando log-error para escribir advertencias / errores en un archivo. Cuando realizo la instrucción INSERT IGNORE..SELECT, simplemente sigue escribiendo estos mensajes de advertencia.

120905 3:01:23 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. INSERT IGNORE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave.

Quiero dejar de mysql logwriter sigue escribiendo el error una y otra vez. (No puedo ver otro registro porque completan todo el archivo de registro ...)

Antes que nada, inserto (a, b, c) en una tabla. c debe ser único en la tabla, y a, b se utilizan para seleccionar. La consulta será así

SELECT c FROM table WHERE a=value1 AND value2<b AND b<value3

Y mi consulta de inserción es

INSERT IGNORE INTO table VALUES (,,),(,,)...(,,)

Pensé que podría cambiar la consulta para no generar una advertencia, pero mis datos contienen un campo único y debo garantizar que el archivo sea único en la tabla. Y 500 ~ 2000 filas deben insertarse cada pocos segundos, así que tengo que hacer una inserción masiva.

Si ya hay una docena de millones de filas insertadas, y necesito insertar otras 2000 filas en pocos segundos. ¿Cómo puedo insertarlos de forma segura en la tabla sin llenar el archivo de registro con las advertencias?

(No puedo desactivar el registro binario porque necesito usar la replicación de MySQL).


Puedes usar

SET GLOBAL LOG_WARNINGS = 0

para desactivar el registro y

SET GLOBAL LOG_WARNINGS = 1

para volver a encenderlo Mi sugerencia personal es envolver la consulta ofensiva con estos en lugar de establecerla globalmente para que pueda rastrear si otras consultas también causan el problema.

Tenga en cuenta que las versiones anteriores de MySQL no son compatibles con esto.


Creo que esta pregunta aún está abierta. Use set max_error_count=0; your unsafe queries; set max_error_count=64;

antes de las consultas que desea ejecutar, es una variable de sesión, por lo que no necesita ser superusuario para usar. No solo, no se emitirán advertencias cuando llame a show warnings limit 5; pero tales advertencias no informan en los archivos de registro de MySQL. también puedes usarlo en procedimientos almacenados. Después de sus consultas, sabe que no son seguras, puede volver a colocar esta variable en su valor original.