3 votes

L'incrément automatique a été remis à 1 automatiquement.

Je viens de rencontrer un problème que je n'arrive pas à résoudre.

J'ai une table de base de données project_queues qui est utilisé comme une file d'attente, où je stocke quelques enregistrements. Lorsque les enregistrements sont traités, ils sont supprimés. La suppression est invoquée par la construction de rails record.destroy dans une boucle qui déclenche DELETE record FROM table sur la base de données MySql.

Mais j'ai remarqué que dans le tableau project_queues les autoIncrément Id (clé primaire) a été réinitialisé à 1 . (Ce qui a endommagé mes références dans la table d'audit. Le même enregistrement renvoie maintenant à plusieurs files d'attente différentes).

show create table project_queues;

CREATE TABLE `project_queues` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
   ...
   ...
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=1 

Je n'utilise pas TRUNCATE project_queues ou abandonner la construction du tableau et le recréer dans le code.

Quelqu'un a-t-il rencontré le même problème que moi ? Je ne trouve pas non plus d'anomalies dans le journal.

J'utilise Rails 5.2.3 , MariaDB 10.1 .

La connexion entre l'application et la base de données applique ces modes SQL :

  • NO_AUTO_VALUE_ON_ZERO
  • STRICT_ALL_TABLES
  • NO_AUTO_CREATE_USER
  • PAS DE SUBSTITUTION DE MOTEUR
  • NO_ZERO_DATE
  • NO_ZERO_IN_DATE
  • ERREUR_POUR_LA_DIVISION_PAR_ZÉRO

Mais je ne pense pas que cela ait un rapport avec l'IA.

1voto

PiGo Points 129

L'auto-incrément peut être réinitialisé par des mises à jour. Puisque vous l'utilisez comme une file d'attente, je suppose que vous ne faites pas de mises à jour, mais cela vaut la peine de poser la question.

Par ailleurs, quelle implémentation de table utilisez-vous, MyIsam, InnoDB, autre ... ?

1voto

Jan Krupa Points 181

Bon ok, j'ai trouvé le problème (c'est un problème connu depuis 2013).

Voici comment reproduire le problème.

# Your MariaDB Server version: 10.1.29-MariaDB MariaDB Server
# Engine InnoDB

create database ai_test;
use ai_test;

CREATE TABLE IF NOT EXISTS ai_test(id INT AUTO_INCREMENT PRIMARY KEY, 
                                   a VARCHAR(50));

show table status like 'ai_test' 
  >  Auto_increment: 1

INSERT INTO ai_test(a) VALUES ('first');
INSERT INTO ai_test(a) VALUES ('second');
INSERT INTO ai_test(a) VALUES ('third');

show table status like 'ai_test' 
  >  Auto_increment: 4

MariaDB [ai_test]> Delete from ai_test where a = 'first';
MariaDB [ai_test]> Delete from ai_test where a = 'second';
MariaDB [ai_test]> Delete from ai_test where a = 'third';

show table status like 'ai_test' \G
  >  Auto_increment: 4

# Restart Server
sudo service rh-mariadb101-mariadb stop
sudo service rh-mariadb101-mariadb start

show table status like 'ai_test' \G
  >  Auto_increment: 1

Je vais essayer de trouver une solution pour résoudre ce problème, mais je pense que cela cause des ravages dans de nombreux cas d'utilisation qui se réfèrent à des tables d'archives ou quelque chose comme ça.

Références :

1voto

Jan Krupa Points 181

Résolu

J'ai mis à niveau 10.1.29-MariaDB MariaDB Server à 10.2.8-MariaDB MariaDB Server

Version >= 10.2.4 a résolu le problème de la réinitialisation de la valeur de l'incrément automatique

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X