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

SQL Oracle Discussion :

Séquence Oracle : création d'un nouveau champ dans une table existante


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 16
    Points : 8
    Points
    8
    Par défaut Séquence Oracle : création d'un nouveau champ dans une table existante
    Bonjour,

    Je souhaite générer une clé primaire dans une table existante et contenant déjà 100 000 lignes (environ).

    Pour celà, il me faut utiliser une séquence et un trigger étant donné que les données ne contiennent pas d'index "naturel"

    Je vois bien comment créer la nouvelle colonne, la séquence et le trigger. Mon prb c'est l'ordre SQL qui me permettra de mettre à jour les données existantes. Z'avez une idée d'ordre simple le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE TABLE SET TABLE.CHAMP=seq.Nextval;
    sera-t-il opérationnel?

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Normalement ça marche, sauf bug oracle (je me souviens plus dans quelle version... )

  3. #3
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    parmi les 100 000 lignes, comment identifiez-vous celle qui devra avoir le n° 1 de celle qui devra avoir le n° 95126 ???

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par LeoAnderson
    parmi les 100 000 lignes, comment identifiez-vous celle qui devra avoir le n° 1 de celle qui devra avoir le n° 95126 ???
    Théoriquement, on n'a pas à mettre une règle sur ce genre de chose, l'identifiant ne devant pas être un signifiant. Je suppose qu'il y a une clef alternative à la table pour retrouver ses petits...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    Mon objectif est de créer un identifiant unique pour chaque ligne. Donc le numéro affecté à chaque ligne ne m'importe pas. Par contre, il ne faut pas que deux lignes aient le même numéro!

    Est-ce que l'ordre cité dans le premier post de la discussion respectera ce prérequis!?!

  6. #6
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Vu que c'est une opération "one-shot", je ne prendrais aucun risque et je ferais ça en PL/SQL avec une jolie LOOP et un update unitaire à chaque fetch !

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 16
    Points : 8
    Points
    8
    Par défaut
    C'est là que je suis perdu, j'ai aucun champ (ou concat de champs) me permettant d'identifier de manière unique chaque enregistrement. Celà veut-il dire que je dois créer un jeu d'enregistrement sur la base d'un SELECT (*) puis faire une boucle sur la totalité du jeu d'enregistrement?

  8. #8
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par somnambulie
    C'est là que je suis perdu, j'ai aucun champ (ou concat de champs) me permettant d'identifier de manière unique chaque enregistrement. Celà veut-il dire que je dois créer un jeu d'enregistrement sur la base d'un SELECT (*) puis faire une boucle sur la totalité du jeu d'enregistrement?
    Oui, aucun souci, le parcous du curseur vous ramenera chacune de vos ligne une (et une seule) fois, je ne vois pas ce qui vous inquiète ?

    La syntaxe donnée au début fonctionne, même si ce n'est pas forcément la plus élégante :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    SQL> CREATE TABLE Test (
      2  id Number (10),
      3  libe VARCHAR2 (32));
     
    Table créée.
     
    SQL> CREATE Sequence SEQ_ID_TEST START WITH 1 INCREMENT BY 1;
     
    Séquence créée.
     
    SQL> INSERT INTO Test (id, libe) VALUES (NULL, 'Test 1');
     
    1 ligne créée.
     
    SQL> INSERT INTO Test (id, libe) VALUES (NULL, 'Test 2');
     
    1 ligne créée.
     
    SQL> UPDATE TEST
      2     SET id = SEQ_ID_TEST.NextVal;
     
    2 ligne(s) mise(s) à jour.
     
    SQL> SELECT * FROM Test;
     
            ID LIBE
    ---------- --------------------------------
             1 Test 1
             2 Test 2
    N'avez-vous un espace de tests pour essayer ?

    Un moyen de faire des tests sur un petit jeu d'essais est de limiter le nombre de lignes mises à jour (avec une condition sur le ROWNUM).

Discussions similaires

  1. Réponses: 5
    Dernier message: 18/09/2014, 15h40
  2. Réponses: 2
    Dernier message: 16/10/2010, 16h18
  3. rajouter un champs dans une table existante
    Par pierre2410 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/07/2007, 16h55
  4. Réponses: 3
    Dernier message: 10/05/2007, 07h43

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