Précédent   Forum des professionnels en informatique > Bases de données > Décisions SGBD
Décisions SGBD Forum de décisions sur le choix en bases de données. Le Comparatif
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/07/2004, 15h05   #1
Membre à l'essai
 
Inscription : mai 2004
Messages : 58
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 58
Points : 20
Points : 20
Par défaut [SGBDR] Gestion des clefs

Bonjour les amis,

Je voulais savoir le mécanisme de gestion interne (par le SGBD) des clefs des tables.
En fait ce qui me gêne c'est cette histoire qu'une clef est utilisée une fois et ne peut pas être réutilisée après. Donc ma question est la suivante:
Si la taille de la variable contenant la clef est de 1octet, alors que se passe-t-il lorsque on arrive à la dernière valeur possible sur 1octet. Le système reprend-t-il les nombres non utilisés ou il ne peut plus générer de clef et donc ce cas il renvoit une erreur de dépassement?

Merci pour votre aide
vsavoir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2004, 09h55   #2
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
Avec, une clé d'1 octet, tu peux gérer au plus 255 occurrences, 1 point c'est tout.

Il faut garder présent à l'esprit qu'une clé sert avant toute chose de discriminant: elle permet de différentier 2 occurrences, même si ces occurrences sont très proches.

L'exemple type sont des jumeaux: mêmes nom de famille, date de naissance, etc...
=> pour la famille, c'est le prénom qui sert de clé
=> pour les autorités, c'est le n° de S.S (il contient le rang de naissance)

Pour en revenir au SGBD, il est clair que 2 enreg ne peuvent avoir la même clé:
1/ d'abord parcequ'il serait incapable de restituer 1 enreg à partir de cette clé (en fait, il peut, mais ce sera tjs le même enreg: au 1er trouvé, il arrête de bosser)
2/ ensuite parceque peut se poser le pb des clés étrangères : nos jumeaux vont avoir des enfants, et pour indiquer la filiation on peut vouloir utiliser le n° S.S du parent: si on demande "quels sont les enfants d'un des jumeaux, on récupère tous les enfants des 2 jumeaux !
3/ d'autres soucis en cascade : UPDATE/DELETE => comment indiquer le décès d'un des jumeaux ?
4/ déclarer 1 clé, ça donne implicitement 1 index sur la colonne "clé"=> le classement des valeurs est maintenu dans l'ordre (croissant ou décroissant) par le SGBD: si on dispose de 2 clés de valeur=1, laquelle est supérieure à l'autre ? si (comme) tu ne peux répondre à cette question, pourquoi le SGBD pourrait-il le faire ?

J'espère avoir répondu à tes interrogations.
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2004, 10h36   #3
Membre à l'essai
 
Inscription : mai 2004
Messages : 58
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 58
Points : 20
Points : 20
Je te remerci d'avoir pris le temps de réponde à ma question.
Pour plaisanter: puisque ta réponse n'est pas la bonne alors je considère que ma question est mauvaise. .
En fait, je comprend bien le principe de clef (unicité). Comme tu me la fait remarquer avec 1 octet tu peux avoir 255 clef seulement, mais c'était juste pour l'exemple. Bon je reformule ma question:
suppons que la la dernière clef attribuée par le SGBD est 255, alors quelle clef attribuera-t-il à un nouveau enregistrement? Est-ce qu'il reprend les clefs qui ont été supprimé (entre 1 et 255) et donc qui ne sont pas utilisés ou bien il ne peut plus attribuer de clef?

Merci.
vsavoir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/07/2004, 14h30   #4
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
Tu sembles évoquer l'auto-attribution par le SGBD d'un numéro faisant office de clé ? (avec auto-incrément ?)
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2004, 11h47   #5
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
1) après 255 il générera une erreur et plus d'insertion
2) on utilise en général une clef basée sur l'entier de taille du mot processeur, soit 32 octets et cela pour des raions de performances (donc 4 milliards 300 millions de clefs possibles)
3) en 32 bits, à raison d'une insertion par seconde sans jamais s'interrompre, il te faudra 136 ans pour générer cette erreur.
Dans le cas improbable ou tu arrive à la fin de tes clefs, tu peut combiner une deuxième colonne. Dans ce cas, tu disposera de quelques 600 millirads d'années avant d'épuiser toutes mes combinaisons...

Enfin, principe de base UNE CLEF CONSOMMÉ NE DOIT JAMAIS ÊTRE RÉATTRIBUÉ...

Que se passe t-il si tu doit remonter une sauvegarde partielle ?

A lire :
http://sqlpro.developpez.com/ClefsAuto/SQL_ClefsAuto.html

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/10/2004, 15h44   #6
Membre à l'essai
 
Inscription : mai 2004
Messages : 58
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 58
Points : 20
Points : 20
Merci a tous.
vsavoir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2005, 16h57   #7
Membre régulier
 
Inscription : juillet 2005
Messages : 175
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 175
Points : 80
Points : 80
Bonjour,

une erreur est produite si on laisse le soin au SGBDR de choisir lui même la clé. Par contre si dans notre INSERT on précise comme clé la valeur
d'une qui a été supprimée, alors l'INSERT se produit correctement au
risque de perdre l'intégrité des données.

Bonne journée.
dcollart est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2005, 17h25   #8
Membre régulier
 
Inscription : juillet 2005
Messages : 175
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 175
Points : 80
Points : 80
Bonjour,

Petite précision. Dans le cas où on précise la valeur de la clé dans
l'INSERT, le SGBDR attribuera la valeur maximale possible à la clé
si la valeur saisie est plus grande que la valeur maximale permise.
La valeur maximale possible ne sera attribuée que si elle n'est pas
déjà utilisée.

exemple d'une clé codée sur un SMALLINT(1) :

Si dans notre INSERT, on précise la valeur 100 000 pour la clé alors
le SGDR attribuera la valeur maximale 32 767 (si elle n'est pas déjà
utilisée).

Face à ce phénomène, il est important de s'assurer que les clés des
tables liées par une relation (clés primaires et étrangères) soient du
même type.

Pour revenir à notre exemple.....

Supposons que notre transaction doit insérer un enregistrement dans
une table dont la clé primaire est codée sur un SMALLINT(1) puis insérer
une enregistrement dans une autre table dont la clé étrangère est codée
sur un INTEGER (ces deux tables étant liées par une relation).

L'insertion de la valeur 100 000 pour la clé primaire donnera 32 767.
L'insertion de la valeur 100 000 pour la clé étrangère donnera 100 000.

Résultat : clés primaire et étrangère différentes => problème d'intégrité
des données.

Bonne journée.
dcollart est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h10.


 
 
 
 
Partenaires

Hébergement Web