Je viens de rencontrer un problème que je ne parviens pas à résoudre.
J'ai une table de base de données project_queues
qui est utilisée comme file d'attente, où je stocke certains 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 maintenant j'ai remarqué, que dans le tableau project_queues
, l ' autoIncrement Id (clé primaire) a été rétabli à 1 . (Ce qui a endommagé mes références dans la table d'audit. Le même enregistrement pointe maintenant vers plusieurs files d'attente de projets 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 supprimez la construction de la table et créez-la à nouveau dans le code.
Quelqu'un a-t-il rencontré un problème similaire comme moi? Je ne trouve aucune anomalie dans le journal non plus.
J'utilise Rails 5.2.3 , MariaDB 10.1 .
La connexion de l'application à la base de données applique ces modes SQL:
Mais je ne pense pas que cela ait quelque chose à voir avec l'IA.
3 Réponses :
Auto_increment peut être réinitialisé par des mises à jour. Puisque vous l'utilisez comme file d'attente, je suppose que vous ne faites pas de mises à jour, mais cela vaut la peine de le demander.
De plus, quelle implémentation de table utilisez-vous, MyIsam, InnoDB, autre ...?
Non, je n'utilise pas de mises à jour, seulement Insérer et Supprimer. Implémentation de la table ENGINE = InnoDB.
Ok, j'ai trouvé le problème (il s'agit d'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 de contournement pour résoudre ce problème, mais je pense que cela cause des ravages dans de nombreux cas d'utilisation qui font référence à des tables d'archive ou à quelque chose du genre.
Références :
J'ai mis à jour 10.1.29-MariaDB MariaDB Server
vers 10.2.8-MariaDB MariaDB Server
Version> = 10.2.4 < / a> a résolu la réinitialisation de la valeur d'incrémentation automatique
Aussi MySQL 8.0.
Peut-être ai-je trouvé une question similaire stackoverflow.com/questions/38786800/...
Mais vous avez redémarré le serveur après avoir supprimé les lignes.