IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

Réinitialiser une séquence


Sujet :

Oracle

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut Réinitialiser une séquence
    Bonjour,

    J'essaye depuis plusieurs heures mais en vain de réinitialiser une séquence pour que ma clé primaire d'une table recommence à 1 car j'ai fait des tests dans cette table et j'ai donc supprimer les donner sauf que j'arrive pas à remettre ma clé primaire à 1.
    J'ai essaye pleins de requête sql proposer sur le net mais en vain.
    La valeur actuelle de ma clé primaire est 8.

    MErci de votre aide

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Vous avez deux solutions:
    1. supprimer et récréer la séquence avec l'inconvénient d'éventuellement perdre les droits données sur cette séquence et d'invalider certaines objets
    2. modifier le pas de la séquence à -7, utiliser la séquence pour retrouver la valeur courante 1 et remodifier le pas à 1

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    OK, merci
    En revanche, j'ai un problème. J'ai une contrainte unique sur ma table et quand je vais un insert identique au précédent, cela le bloque, c'est normal. Mais il enregistre l'id que je voulais mettre en mémoire.
    Du coup, au lieu d'avoir 2 en clé primaire pour mon second enregistrement, sa m'insère 3 en clé primaire.

    voici la séquence et le trigger:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE SEQUENCE SEQ
    START WITH 1
    INCREMENT BY 1;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TRIGGER AUTO
    BEFORE INSERT ON MaTable
    FOR EACH ROW
    BEGIN
    SELECT SEQ.nextval INTO :new.idFROM DUAL;
    END;

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Tu recontrerais le même problème avec un identifiant auto incrémenté.
    Le propre d'un tel système (avec séquence ou auto-incrément, suivant la version du SGBD) est de fournir un identifiant unique sans aucun risque de doublon. Pas d'assurer une suite sans "trou".
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Il me semblait que par exemple, si mon insert retourner une erreur, l'id ne s'auto incrémenté pas et donc que mon insert suivant aurai bien 2 comme clé primaire et non 3 comme mon cas ici.
    Je m'expliquer:
    Mon premier insert a bien eu lieu, donc j'ai un en clé primaire
    Mon second insert a échoué
    Mon troisième insert a bien eu lieu, or j'ai 3 au lieu de 2 en clé primaire

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 789
    Points
    30 789
    Par défaut
    L'incrémentation de la séquence est effectuée avant l'insertion, donc avant que la contrainte d'unicité soit testée et la transaction annulée ou validée. La "consommation" de la valeur de séquence s'effectue hors transaction et il n'est pas possible de revenir dessus.
    Suppose que deux opérations d'insertion dans la table, initiées par deux utilisateurs différents soient exécutées simultanément.
    La séquence était à 1. La première transaction utilise la valeur 2, la seconde la valeur 3. Alors que la seconde opération est validée, la seconde est rejetée. Quelle serait la prochaine valeur dans la séquence ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Je comprend pas ce que tu dis

  8. #8
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Il y pas moyen de mettre une condition when qui me dit de déclencher le trigger si mon insert ne retourne pas d'erreur

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Tu utilises le trigger pour renseigner, à partir de la séquence, un identifiant obligatoire dans ta ligne.
    La ligne n'est validée qu'à la condition que cet identifiant soit renseigné. Il faut donc que la séquence soit utilisée avant la validation.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  10. #10
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Mon trigger me sert pour l'auto incrémentation
    Moi ce que je cherche c'est de ne pas avoir de trou dans ma clé primaire: je ne veut pas 1 - 3 - 4 -9 mais 1 - 2 - 3 - 4 - 5 ...

  11. #11
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    J'ai essayer de faire une procédure stockée que j'appellerai dans mes triggers mais celle-ci ne compile pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    CREATE OR REPLACE PROCEDURE reset_sequence(nom_sequence IN VARCHAR2)
    AS
    valeur INTEGER;
    valeur_min INTEGER;
    difference INTEGER;
    BEGIN
    -- Calculer la difference pour le nouveau increment
    SELECT min_value INTO valeur_min FROM user_sequences WHERE sequence_name = nom_sequence;
    SELECT nom_sequence.nextval INTO valeur FROM dual;
    difference := valeur_min - valeur;
    -- Modifier l'increment
    EXECUTE IMMEDIATE
    'ALTER sequence nom_sequence INCREMENT BY '
    || difference;
    -- Incrementer la sequence
    SELECT nom_sequence.nextval INTO valeur FROM dual;
    -- Remettre l'increment a 1
    EXECUTE IMMEDIATE
    'ALTER sequence nom_sequence INCREMENT BY 1';
    END;

  12. #12
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par totot Voir le message
    Moi ce que je cherche c'est de ne pas avoir de trou dans ma clé primaire: je ne veut pas 1 - 3 - 4 -9 mais 1 - 2 - 3 - 4 - 5 ...
    C'est impossible, une séquence n'a pas pour but de ne pas avoir de trou comme déjà mentionné par Alain :
    Citation Envoyé par al1_24 Voir le message
    Le propre d'un tel système (avec séquence ou auto-incrément, suivant la version du SGBD) est de fournir un identifiant unique sans aucun risque de doublon. Pas d'assurer une suite sans "trou".
    Si l'absence de trou est obligatoire, il faut le coder manuellement en passant par une table "de séquence" qu'on incrémente après avoir sérialisé l'accès à la table par un SELECT FOR UPDATE.
    En terme de concurrence d'accès, c'est plus lent.

    Mais une clé primaire auto-incrémentée étant un identifiant technique interne au SGBD, et donc n'ayant aucune signification fonctionnelle, la présence de trou n'est pas un problème.

    [EDIT]
    Citation Envoyé par totot Voir le message
    J'ai essayer de faire une procédure stockée que j'appellerai dans mes triggers mais celle-ci ne compile pas:
    Vous voulez modifier votre séquence via trigger ? C'est une très mauvaise idée, heureusement que vous avez eu des erreurs de compilation.

  13. #13
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Ok
    Donc il faut mieux que j'abandonne mon idée
    Et que si j'ai un insert qui s'est pas fait pour telle ou telle raison, sa va quand même m'incrémenter mon id même s'il ne se trouvera pas dans la table

  14. #14
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par totot Voir le message
    Ok
    Donc il faut mieux que j'abandonne mon idée
    Et que si j'ai un insert qui s'est pas fait pour telle ou telle raison, sa va quand même m'incrémenter mon id même s'il ne se trouvera pas dans la table
    exactement

  15. #15
    Débutant  
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 225
    Points : 132
    Points
    132
    Par défaut
    Du coup j'aurais, par exemple, si sur 3 insert,2 seulement on fonctionné: 1 - 3 dans ma table en considérant que le second a planter

  16. #16
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par totot Voir le message
    Du coup j'aurais, par exemple, si sur 3 insert,2 seulement on fonctionné: 1 - 3 dans ma table en considérant que le second a planter
    oui, mais il faut aussi voir aussi que souvent il est possible de supprimer des lignes ce qui génère également des "trous"

Discussions similaires

  1. Réponses: 8
    Dernier message: 10/10/2012, 10h00
  2. Réinitialiser journalièrement une Séquence
    Par mortimer.pw dans le forum Administration
    Réponses: 1
    Dernier message: 06/02/2009, 14h27
  3. réinitialiser une séquence à 0
    Par midotoon dans le forum SQL
    Réponses: 7
    Dernier message: 19/06/2007, 15h59
  4. Passer une séquence en parametre
    Par djousss dans le forum CORBA
    Réponses: 2
    Dernier message: 02/12/2003, 22h39
  5. Extraire une séquence d'un fichier MPEG
    Par enzosp dans le forum DirectX
    Réponses: 2
    Dernier message: 24/02/2003, 11h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo