6 votes

Comment forcer MySQL à prendre 0 comme valeur d'auto-incrémentation valide

En résumé, j'ai un fichier SQL que je veux importer en tant que fichier de style skel, donc cela sera fait de manière répétée, de façon programmée. Je peux modifier le fichier SQL comme je le souhaite, mais je préfère ne pas toucher à l'application elle-même.

Cette application utilise userid = 0 pour représenter l'utilisateur anonyme. Il a également une entrée pertinente (vide) dans la base de données pour représenter cet 'utilisateur'. Ainsi, la ligne dans mon fichier skel.sql ressemble à quelque chose comme ceci:

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

Le problème avec cela est que uid est un champ auto_increment, pour lequel, techniquement, 0 est une valeur invalide. Ou du moins, si vous le définissez à 0, vous dites essentiellement à MySQL, "Veuillez insérer le prochain identifiant dans ce champ"

Maintenant, je suppose que je pourrais mettre une requête INSERT suivie d'une requête UPDATE dans mon fichier SQL, mais y a-t-il un moyen de dire à MySQL en général que oui, je veux réellement insérer 0 dans ce champ?

9voto

Dan Carley Points 24959

Vous pouvez utiliser :

SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'

Ce qui, comme décrit ici, empêchera MySQL d'interpréter un ID d'INSERT/UPDATE de 0 comme étant le prochain ID de séquence. Ce comportement sera limité à NULL.

C'est ce que je considère comme un comportement assez mauvais de l'application. Vous devrez être très prudent pour qu'il soit utilisé de manière cohérente, surtout si vous choisissez de mettre en œuvre la réplication ultérieurement.

3voto

user53772 Points 21

Vérifiez le mode de votre base de données SQL avec :

SELECT @@[GLOBAL|SESSION].sql_mode;

S'il est vide ou non défini, utilisez :

SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'

ATTENTION! Si vous utilisez GLOBAL, ce n'est pas un changement immédiat, vous devez redémarrer votre connexion pour appliquer le paramètre.

Donc, si vous restaurez des données d'une base de données à une autre, par exemple, et que vous n'êtes pas sûr que ce paramètre est appliqué, utilisez SESSION pour un changement immédiat (réinitialise lors de la fermeture de la connexion). Une fois terminé, insérez une valeur de 0 et elle ne changera pas même si le sql_mode est modifié.

Pour réinitialiser ce mode (et d'autres), utilisez

SET [GLOBAL|SESSION] sql_mode=''

Les valeurs d'auto-incrément à zéro ne sont pas recommandées d'être utilisées, car ce n'est pas défini par défaut dans les bases de données MySQL.

Pour plus d'informations, consultez la page de développement de MySQL sur ce sujet

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X