Base clef primaire

Bonjour de CAHORS 46
Existe-t-il une manip, lorsqu'on supprime des enregistrements dans une base, pour remettre à jour l'incrémentation dans le champ de la clef primaire pour avoir une suite logique.
1
2
3
4
5
6
7
au lieu de
1
4
5
7
Nom de la table = CUISINE

Clé primaire Nom de champ = ID
le champ est de type Integer autovaleur OUI

CONFIGURATION
WINDOWS7
LibreOffice 3.5.4
Java 1.6.0_31

J'ai tenté en vain toutes les possibilités que j'ai pu trouver sur les listes de discussions
Merci une nouvelle fois pour votre collaboration et votre indulgence pour le profane.
Cordialement
Raoul

Bonjour

HOHWILLER Raoul wrote

Existe-t-il une manip, lorsqu'on supprime des enregistrements dans une
base, pour remettre à jour l'incrémentation dans le champ de la clef
primaire pour avoir une suite logique
....
J'ai tenté en vain toutes les possibilités que j'ai pu trouver sur les
listes de discussions

Il existe une manipulation et elle est décrite... non dans les listes mais
tout simplement dans la FAQ (foire aux questions) sur notre wiki :
http://wiki.documentfoundation.org/FR/FAQ/Base/127

Cordialement
Pierre-Yves

Bonsoir,

J'ai tenté en vain toutes les possibilités que j'ai pu trouver sur les
listes de discussions
Merci une nouvelle fois pour votre collaboration et votre indulgence
pour le profane.

On peut faire une copie de la table :
- sélection de la table avec la souris ;
- glisse-dépose dans l'espace Tables, l'assistant de copie s'ouvre;
- on lui indique de ne copier que la structure;
- coche la case "créer une clé primaire avec un champ ID (en majuscule
par défaut);
- en faisant suivant, on sélectionne tous les champs, sauf le champ "id"
de la table d'origine;
- on suit l'assistant jusqu'à la fin, une nouvelle table est générée
sans données ;
- on enregistre et on ferme cette nouvelle table;
- on fait clic-droite sur la nouvelle table, et on choisit Modifier dans
le menu contextuel;
- on vérifie que le champ ID est bien mis en autovaleur= OUI;
- on enregistre, puis on ferme celle-ci;
- on double-clic sur la nouvelle table puis on déplace sa fenêtre pour
pouvoir voir la fenêtre principale de la bdd;
- on sélectionne la table d'origine avec la souris, puis on la
glisse-dépose sur la fenêtre ouverte de la nouvelle table - les données
sont copiées et le champ ID s'autoincrémente tout seul comme il faut.

Enfin, il restera a soit supprimer l'ancienne table, soit à la renommer,
puis renommer la nouvelle table pour qu'elle porte le nom de l'ancienne.

Bon, c'est un peu détourné comme solution, mais ça marche.

Autrement, il reste les commandes classiques que l'on entre par le biais
du menu Outils > SQL :

ALTER TABLE CUISINE ALTER COLUMN ID RESTART WITH 1;

SHUTDOWN COMPACT

Puis fermer LO complètement, plus le Quickstarter s'il est lancé.

Lors du prochain démarrage, l'ouverture de ta table devrait afficher la
bonne séquence.

Mais mes expériences de ce soir ont montré que cela ne marche pas...donc
il doit y avoir un bogue quelque part...

Alex

Merci pour votre collaboration.
Effectivement la commande SQL mentionnée dans le présent message ne fonctionne pas.
J'ai le message suivant :
  1: Commande exécutée avec succès.
Mais cela ne change rien
Bonne soirée à tous en attendant de trouver une solution

Hello,

Si ta clef est en auto-increment, tu ne devrais pas pouvoir.
Par ailleurs, ce genre de pratique serait dangereux : prenons l'exemple d'une base [1, 2, 3, 4, 5].
Tu supprimes l'enregistrement 3... que doit-il se passer ?
-> Remettre la valeur de la clef pour la prochaine insertion à 3 ? Que se passe-t-il quand tu vas vouloir recréer l'enregistrement 4 toujours existant ?
-> Renuméroter tous les enregistrements existants ? Que faire si ils sont enregistrés dans d'autres tables ?

Je ne sais pas quel est ton besoin derrière, mais je pense que tu devrais également nous le présenter, nous pourrions mieux t'aider à ce niveau là je pense.

Bonne après-midi,
Anael

Bonjour à TOUS
Anael, je te remercie pour ta réponse . Effectivement, il s'agit d'une clef auto-incrément. Cette base que j'alimente selon mes besoins me sert à rajouter ou supprimer des enregistrements. Elle n'a aucune relation.
Si effectivement, pour ce type de champ, il n' y a aucune possibilité de remise à jour de l'incrémentation ,c'est dommage, mais on attendra une évolution possible .
Cordialement

Bonjour,

Il ne faut pas attacher une importance particulière à une clé primaire auto-incrémentée, sa valeur n'a (ne doit avoir) aucune valeur en soi, elle ne sert qu'à garantir l'unicité de chaque tuple.

Ceci dit, il m'est arrivé d'utiliser la commande ALTER... RESTART mentionnée par Alex et cela avait fonctionné.

Bernard

Bonjour

HOHWILLER Raoul wrote

Effectivement, il s'agit d'une clef auto-incrément.
... Elle n'a aucune relation.

Ceci est un des cas illustrés dans la FAQ citée dans ma réponse précédente.
http://wiki.documentfoundation.org/FR/FAQ/Base/127

L'as-tu suivie et si oui, à quelle étape cela ne fonctionne-t-il pas ?

Cordialement
Pierre-Yves

Bonjour

HOHWILLER Raoul wrote

Effectivement, il s'agit d'une clef auto-incrément.
... Elle n'a aucune relation.

Ceci est un des cas illustrés dans la FAQ citée dans ma réponse précédente.
http://wiki.documentfoundation.org/FR/FAQ/Base/127

L'as-tu suivie et si oui, à quelle étape cela ne fonctionne-t-il pas ?

Cordialement
Pierre-Yves

Bonjour Pierre Yves

Au départ, j'ai tenté la procédure SQL et je me suis aperçu qu'elle n'était pas adaptée à mon cas

ALTER TABLE "NomTable" ALTER COLUMN "NomClePrimaire" RESTARTWITH 1

Suite à ta question, je n''ai pas suivi la procédure prévue dans la FAQ .

Pour ma formation perso, dès que j'ai un peu de temps je me penche dessus.

Amicalement et merci

Bonjour Raoul,

Il m'est fréquemment arrivé à mes débuts ce genre de situation, notamment
lorsque la table n'était pas encore en relation et voulant que les clés
primaires se suivent sans rupture.
J'ai fini par utiliser cette méthode, facile à mettre en oeuvre:
1- Faites comme demandé un "alter table... restart with 1"Checkpoint defrag
et shutdown compact;
2- quitter la base et Rouvrez la ensuite;
3- Afficher la table concernée;
4- Ouvrez une feuille de Calc, et Faîtes glisser tous les enregistrements
dans la feuille;
5- Supprimez ensuite tous les enregistrements de la table par 1 clic droit,
mais pas la table elle-même;
6-Ouvrez l'Outil SQL et repassez la ligne de commande précédente, et fermez
la base;
7- Dans la feuille Calc, Mettez les enregistrements en ordre ( Alphabétique,
croissant ou décroissant...);
8- Et refaites la numérotation de la clé des enregistrements de 0 ou 1 à n;
9- Rouvrez la base et positionnez sur la table concernée; il s'agira de
copier les données de Calc sur la table;
10- une fenêtre Assistance s'ouvrira avec les têtes de colonnes identiques
de la feuille et de la Table;
11- Cochez les appariements et Terminé à la fin.

Vous obtiendrez votre table avec les clés qui se suivent sans rupture,
jusqu'à la prochaine suppression d'un enregistrement.
Voilà!
Ce pas à pas a l'air très long mais très vite on acquiert un enchainement de
gestes automatique.

@+

Bonjour Raoul

HOHWILLER Raoul wrote

Au départ, j'ai tenté la procédure SQL et je me suis aperçu qu'elle
n'était pas adaptée à mon cas

C'est précisé dans la FAQ...
La procédure adaptée à ton cas est celle commençant dans la FAQ par :
"On souhaite tout renuméroter (y compris les enregistrements existants)"

HOHWILLER Raoul wrote

Suite à ta question, je n''ai pas suivi la procédure prévue dans la FAQ .
Pour ma formation perso, dès que j'ai un peu de temps je me penche dessus.

Ok... pour ton information, puisqu'il est question de temps... je te donnais
le lien vers la procédure la plus simple 7 min. après que tu aies posé ta
question :slight_smile:

HRk2o wrote

J'ai fini par utiliser cette méthode, facile à mettre en oeuvre:
1- Faites comme demandé un "alter table... restart with 1"Checkpoint
defrag et shutdown compact;

Le Alter table...restart 1 ne fonctionne pas et est inutile ici car la table
contient
des enregistrements et on souhaite tout renuméroter (et non poursuivre après
la dernière valeur).

Le compactage (par shutdown ou checkpoint) n'a *aucune* influence sur la
renumérotation.
Il n'aura une incidence que sur la taille de la base... ce qui n'est pas
inutile non plus.

Le reste de la procédure fonctionne... mais reste plus compliqué qu'utiliser
directement
l'assistant de copie (point 10 et 11).

Cordialement
Pierre-Yves

Bonjour

Merci à vous tous pour votre collaboration, avec tous vos conseils je vais pouvoir me débrouiller.
Cordialement
Raoul