2009-07-17 16 views
60

En resumen, tengo un archivo SQL que quiero importar como un archivo de estilo skel, por lo que esto se hará de forma repetida, mediante programación. Puedo editar el archivo SQL como quiera, pero prefiero no tocar la aplicación en sí.Cómo forzar a MySQL a tomar 0 como valor autoincrementado válido

Esta aplicación usa userid = 0 para representar al usuario anónimo. También tiene una entrada relevante (en blanco) en la base de datos para representar este 'usuario'. Por lo tanto, la línea en mi skel.sql ve algo como esto:

INSERT INTO `{{TABLE_PREFIX}}users` VALUES (0, '', '', '', 0, 0, 0, '', '', 0, 0, 0, 0, 0, NULL, '', '', '', NULL); 

El problema con esto es que es un campo uidauto_increment, para lo cual, técnicamente, 0 es un valor no válido. O al menos, si lo configuras en 0, básicamente le estarás diciendo a MySQL: "Por favor, inserta la siguiente identificación en este campo".

Ahora, supongo que podría poner a continuación, una consulta INSERTUPDATE en mi archivo SQL, pero hay una manera de decirle a MySQL, en general, que sí, que en realidad quiero insertar 0 en este campo?

Respuesta

74

A partir de la respuesta que obtuve here:

que puede utilizar:

SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO' 

que como se describe here, impedirá MySQL desde la interpretación de un ID INSERT/UPDATE de 0 como la siguiente secuencia CARNÉ DE IDENTIDAD. Tal comportamiento se limitará a NULL.

Sin embargo, es lo que consideraría bastante mal comportamiento de la aplicación. Deberá tener mucho cuidado de que se use de forma coherente, especialmente si elige implementar la replicación en una fecha posterior.

+12

Una cosa de la que debes tener cuidado: 'sql_mode' es una lista de banderas delimitada por comas. Si lo hace 'sql_mode = 'NO_AUTO_VALUE_ON_ZERO'', puede deshabilitar inadvertidamente otras banderas – Kip

+0

Esta solución funcionó básicamente para mí, sin embargo, mi volcado también incluyó algunos lugares donde estaba anulando el' sql_mode' en el medio del archivo sql y luego restablecer a la variable 'OLD_SQL_MODE' que se configuró para volver al final del script. Esto estaba anulando mi 'NO_AUTO_VALUE_ON_ZERO' en el medio de mi script, haciendo que esto no funcione. Mi solución fue crear una nueva variable de 'INIT_OLD_SQL_MODE' que solía restablecer al final y después de establecer' sql_mode' en 'NO_AUTO_VALUE_ON_ZERO', establecí una nueva variable de' OLD_SQL_MODE' que esas modificaciones temporales podrían restablecerse a –

19

Compruebe el modo de base de datos SQL con:

SELECT @@[GLOBAL|SESSION].sql_mode; 

si está vacío o no está establecido, el uso:

SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO' 

¡Cuidado! Si usa GLOBAL, no es un cambio inmediato, debe reiniciar su conexión para aplicar la configuración.

lo tanto, si va a restaurar los datos de una base de datos a otro, por ejemplo, y no está seguro de si se aplica esta configuración, utilice SESSION para un cambio inmediato (se restablece cuando se cierra la conexión). Cuando termine, inserte el valor 0 y no cambiará aunque se cambie sql_mode.

Para restablecer este modo (y otros) utilizan

SET [GLOBAL|SESSION] sql_mode='' 

Los valores cero de incremento automático no son recomendables porque no están configurados como predeterminados en bases de datos MySQL.

Para obtener más información cheque mysql dev page topic en este

5

fallan manera segura:

SET @@session.sql_mode = 
    CASE WHEN @@session.sql_mode NOT LIKE '%NO_AUTO_VALUE_ON_ZERO%' 
     THEN CASE WHEN LENGTH(@@session.sql_mode)>0 
      THEN CONCAT_WS(',',@@session.sql_mode,'NO_AUTO_VALUE_ON_ZERO') -- added, wasn't empty 
      ELSE 'NO_AUTO_VALUE_ON_ZERO'         -- replaced, was empty 
     END 
     ELSE @@session.sql_mode            -- unchanged, already had NO_AUTO_VALUE_ON_ZERO set 
    END 
  • Comprueba si NO_AUTO_VALUE_ON_ZERO ya se encuentra en sql_mode
  • se suma a sql_mode si no está vacío
  • Conjuntos sólo el sesión, recomiendo usarlo solo en las sesiones donde debe insertar un 0
4

Si no queremos modificar con variables de MySQL, aquí hay un truco útil:

INSERT INTO `{{TABLE_PREFIX}}users` VALUES (-1, '', '', '', 0, 0, 0, '', '', 0, 0, 0, 0, 0, NULL, '', '', '', NULL); 

Y luego

UPDATE `{{TABLE_PREFIX}}users` SET id = 0 where id = -1; 

Obviamente, esto supone que usted no está usando los valores negativos de tus identificadores de mesa

+6

Obviamente , no funciona si estás usando un entero sin signo. – fnkr

Cuestiones relacionadas