2009-03-04 5 views
2

Bien sûr, si je mets assez de lignes, il y aura une répétition. Mais supposons que je choisis un champ d'identifiant assez grand.Les identifiants de mysql sont-ils garantis, même si les lignes sont supprimées?

Je veux savoir si je peux supposer que l'identifiant identifie de façon unique la ligne au fil du temps. Et si le client m'envoie un identifiant, je veux être capable de déterminer quelle ligne il désigne ou si la ligne a été supprimée (ou s'il s'agit d'un faux identifiant, mais dans ce cas je ne me soucierai pas de dire, à tort, que la ligne était supprimé).

S'il vous plaît se référer également à ce qui suit: si je redémarre la base de données ou de sauvegarde et de restauration - il sera continuer à créer ids où il a quitté - ou peut-être qu'il décidera de « remplir les trous »

Répondre

4

Si vous avez une "clé primaire d'incrément automatique int non null" que vous ne réinitialisez jamais, alors les IDs ne seront pas réutilisés. Cependant, ceci soulève une question intéressante: que se passe-t-il si vous réutilisez un ancien ID (même si cela n'arrivera pas par défaut dans MySQL, mais le facteur humain compte toujours)?

Si votre base de données est correctement normalisée, en cascade et contraint votre application devrait être en mesure de gérer la réutilisation d'un ID.

Modifier (depuis que vous avez modifié votre message, je Concrétiser ma réponse), à ​​propos de cette citation: « Et si le client me envoie un identifiant que je veux être en mesure de déterminer quelle ligne elle renvoie ou si la ligne a été supprimée ". Il est toujours possible de déterminer à quelle ligne un ID appartient s'il n'est pas effacé (un peu essentiel pour pouvoir extraire des informations de votre base de données).

Cependant si la ligne l'identifiant fait référence est supprimé, il est pas possible de déterminer quelle suite il appartient à ... car il est pas là. Si vous en avez besoin, je vous conseille de mettre en place un certain type de fonctionnalité d'audit, de préférence par triggers.

+0

et quand le réinitialiser? Est-ce quelque chose que je fais avec une commande ou peut-il arriver comme un effet secondaire de quelque chose. – flybywire

+0

Eh bien, ce n'est pas quelque chose qui va probablement se passer - mais c'est possible grâce à diverses commandes sql dans mysql. – thr

+0

Si vous ne savez pas quand réinitialiser, ne le réinitialisez pas. Les identifiants générés automatiquement ne sont pas destinés à être significatifs ni réutilisables. – tehvan

2

La valeur d'auto-incrémentation actuelle est préservée pour toutes les sauvegardes/restaurations via un attribut supplémentaire attaché à la table. Vous pouvez le voir dans une décharge juste après que le moteur =:

mysql> create table foo (bar int(11) primary key auto_increment); 
Query OK, 0 rows affected (0.06 sec) 

mysql> insert into foo() values(),(),(),(); 
Query OK, 4 rows affected (0.00 sec) 
Records: 4 Duplicates: 0 Warnings: 0 

mysql> show create table foo \G 
*************************** 1. row *************************** 
     Table: foo 
Create Table: CREATE TABLE `foo` (
    `bar` int(11) NOT NULL auto_increment, 
    PRIMARY KEY (`bar`) 
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 
1 row in set (0.00 sec) 

Vous pouvez réinitialiser à l'aide « ALTER TABLE nom_table AUTO_INCREMENT = », mais il me semble que la valeur d'attribut est ignorée si elle n'est pas plus que l'identifiant existant maximum lorsque vous faites un insert.

0

Notez également que le comportement décrit de ne pas réutiliser un ID précédemment utilisé est valide pour le moteur MyISAM, mais n'est pas valide pour tous les moteurs disponibles.

Questions connexes