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

pour faire court, j'ai un fichier SQL que je veux importer comme un fichier de style skel , donc ce sera fait à plusieurs reprises, de façon programmatique. Je peux éditer le fichier SQL comme 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 comporte également une entrée (vide) pertinente 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 est que uid est un champ auto_increment , pour lequel, techniquement, 0 est une valeur invalide. Ou du moins, si vous le mettez à 0, Vous dites en gros à MySQL, " s'il vous plaît insérez la prochaine id dans ce champ."

maintenant, je suppose que je pourrais mettre un INSERT puis une UPDATE requête dans mon fichier SQL, mais y a-t-il une façon de dire MySQL en général que oui, je veux réellement insérer 0 dans ce champ?

67
demandé sur Matthew Scharley 2009-07-17 14:20:44

4 réponses

de la réponse j'ai eu ici :

vous pouvez utiliser:

SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'

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

c'est ce que je considérerais comme un comportement assez mauvais de la demande cependant. Tu devras faire très attention que il est utilisé de manière cohérente, surtout si vous choisissez d'implémenter la réplication à une date ultérieure.

81
répondu Matthew Scharley 2017-04-13 12:13:38

Vérifiez votre mode DB sql avec:

SELECT @@[GLOBAL|SESSION].sql_mode;

si elle est vide ou non, 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 réglage.

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

pour réinitialiser ce mode (et d'autres) utiliser

SET [GLOBAL|SESSION] sql_mode=''

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 utiliser la commande a souligné dans ce commentaire

SET sql_mode='NO_AUTO_VALUE_ON_ZERO'
21
répondu I.G. Pascual 2018-04-25 11:20:39

si vous ne voulez pas traiter avec les variables mysql, voici un hack utile:

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

et ensuite

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

évidemment, cela suppose que vous utilisez un entier signé et n'utilisez pas de valeurs négatives pour vos ID de table.

8
répondu emisilva 2018-06-13 15:03:26

Fail safe": 151920920"

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
  • vérifie si NO_AUTO_VALUE_ON_ZERO est déjà défini en sql_mode
  • ajoute à sql_mode si elle n'est pas vide
  • définit seulement la session, je recommande de l'utiliser seulement sur les sessions où vous devez insérer un 0
6
répondu Stefan Rogin 2014-12-09 06:34:54