Comment faire pour forcer MySQL à prendre la valeur 0 comme valide l'auto-incrémentation de la valeur
Longue histoire courte, j'ai un fichier SQL que je veux importer un skel
fichier de style, de sorte que ce sera fait à plusieurs reprises, par programmation. Je peux modifier le fichier SQL cependant je veux, 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 dispose également d'un pertinent (vide) entrée dans la base de données pour représenter cet "utilisateur". Par conséquent, la ligne dans mon 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, c'est que uid
est un auto_increment
champ, pour qui, techniquement, 0
est une valeur non valide. Ou au moins, si vous le réglez à 0, vous êtes essentiellement en disant MySQL, "Veuillez insérer le numéro suivant dans ce domaine."
Maintenant, je suppose que je pourrais mettre un INSERT
puis un UPDATE
requête dans mon fichier SQL, mais est-il une façon de dire à MySQL en général que oui, je veux insérer 0
dans ce domaine?
Vous devez vous connecter pour publier un commentaire.
De la réponse que j'ai ici:
Vous pouvez utiliser:
Qui est décrit ici, permettra d'éviter de MySQL à partir de l'interprétation d'une INSERTION/mise à JOUR de l'ID de 0 comme étant la prochaine séquence ID. Un tel comportement sera limitée à la valeur NULL.
C'est ce que je considère assez mauvais comportement de l'application si. Vous devez être vraiment prudent qu'il est utilisé régulièrement, surtout si vous choisissez de mettre en œuvre la réplication à une date ultérieure.
sql_mode
est une liste séparée par des virgules de drapeaux. Si vous nesql_mode='NO_AUTO_VALUE_ON_ZERO'
, vous pouvez peut-être par inadvertance, la désactivation des autres drapeauxsql_mode
dans le milieu du fichier sql et puis la réinitialisation de la variableOLD_SQL_MODE
qui a été créé pour revenir à la fin du script. C'était primordial monNO_AUTO_VALUE_ON_ZERO
au milieu de mon script qui ne sont pas de travail. Ma solution a été de créer une nouvelle variable deINIT_OLD_SQL_MODE
j'ai utilisé pour remettre à la fin et après j'ai missql_mode
àNO_AUTO_VALUE_ON_ZERO
, j'ai créé une nouvelle variable deOLD_SQL_MODE
que ceux temporaire remplace pourrait réinitialiserVérifier votre sql DB mode:
Si elle est vide ou non, utilisation:
ÊTRE PRUDENT! Si vous utilisez
GLOBAL
, ce n'est pas un changement immédiat, vous devez redémarrer votre connexion pour appliquer le réglage.Donc, si vous êtes de la restauration de données à partir d'un DB à un autre, par exemple, et vous ne savez pas si ce paramètre est appliqué, l'utilisation
SESSION
pour un changement immédiat (il réinitialise lors de la fermeture de la connexion). Lorsque vous avez terminé, insérez une valeur de 0 et qu'il ne changera pas, même si lesql_mode
est changé.Pour réinitialiser ce mode (et d'autres) utilisent des
Zéro auto-incrémentation des valeurs ne sont pas recommandés, car ils ne sont pas mis par défaut dans les bases de données MySQL.
Pour plus d'informations, consultez mysql dev page rubrique sur ce
Mise à jour
Pour MariaDB utilisez la commande a souligné dans ce commentaire
SET sql_mode='NO_AUTO_VALUE_ON_ZERO'
Si vous ne voulez pas traiter avec mysql variables, voici un bon hack:
Et puis
Évidemment, cela suppose que vous êtes à l'aide d'un entier signé et n'utilisant pas de valeurs négatives pour votre id de table.
Fail safe façon: