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 :

Générer une clé primaire selon critère


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2011
    Messages : 40
    Points : 21
    Points
    21
    Par défaut Générer une clé primaire selon critère
    Bonjour,

    Je n'arrive pas à comprendre comment générer une clé primaire automatique selon un critère en java.. Je voudrais par exemple pouvoir faire ceci lors de l'insertion de données :

    Prenons la table catégorie par exemple :
    Insertion de la clé primaire : C00001 avec un nom
    C00002 avec un autre nom
    etc.

    Est-ce que quelqu'un pourrais m'aider ?
    J'ai fais des recherches sur google, et j'ai trouvé certains trucs (je ne sais pas du tout s'ils sont bon), mais je n'ai pas vraiment compris...

    Merci de votre aide
    Mini_Croco

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Il dois venir d'ou ton C00002 ? Un clé primaire, pour ton programme, c'est une donnée comme une autre, ça fait partie des données présentes dans ta requête "insert".
    Si tu veux savoir comment la calculer.. ben faudra être plus précis sur ce que tu veux faire et quelle base de données tu as.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2011
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Le C00002 je voudrais que ça ce génère automatiquement en faite. J'utilise sql developer.
    Il faudrait le faire en pl/sql du coup ?

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    tu veux faire ça en java ou avec sql developper.

    On a compris, tu veux générer C00002, mais quels sont tes critères (pourquoi C, à quoi correspond, le 00002) et encore une fois, quelle base de données?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2011
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    En faite la première lettre contribue à la lettre de la table. Et les chiffres correspondent à l'implémentation de la clé.
    Donc par exemple j'ai une table Catégorie donc la clé primaire doit commencer par C et les 5 chiffres qui suivent (car elle doit être sur 6 caractères) augmente à chaque insertion.
    Je sais pas si j'explique bien.

    J'utilise sql developer pour la base de données. Je préférerai générer la clé par Java si c'est possible car mon application est faite en Java. Mais je ne sais pas ce qui est le mieux.

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    honnêtement, on s'en fout de SQL developper Ca ne fait qu'exécuter du SQL. Ce qui importe, et je pose pour la troisième fois la question, c'est quoi comme base de données?


    Accessoirement, si tu ne fais pas ça en java, cette question n'a rien à faire dans la section java

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2011
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Je ne comprend pas très bien la question sur le type de la base de données.. Vous voulez savoir ce qu'elle contient, comment elle est faite ? Si vous pouviez expliquer, car je répond SQL developer depuis tout à l'heure justement parce que j'ai surement mal compris la question...

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    C'est quoi comme base de donnée?
    Oracle? Mysql? MsSql? Postgresql? HsqlDB? Derby? Access? .... ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2011
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Bin, je vais devoir te donner la même réponse que précédemment... SQL Developer... De Oracle...

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Mini_Croco, Oracle est un grand éditeur qui commercialise énormément de logiciels.
    Il a sous sa coupe Oracle Database (le SGBD donc), MySQL (un autre SGBD), Java, Solaris, SQL Developer - qui permet de se connecter à n'importe quel SGBD pour peu qu'un pilote JDBC existe et qui par conséquent ne s'associe pas de facto à Oracle Database.

    Le plus simple pour lever de doute quand vous parlez d'Oracle Database c'est de préciser la version, si vous parlez de Oracle 9i ou 11g on comprend qu'il s'agit du SGBD.

    Revenons à votre problème initial, il s'effectue en plusieurs manipulations.
    En effet en modélisation on ne créé pas de clef composée.
    Ce serait violer le principe d'atomicité de la première forme normale.

    Je vous conseille ceci :
    Code SQL : 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    create table t_categorie
    ( categorie_id    number  ( 10) not null
    , categorie_nom   varchar2(100) not null
    , constraint pk_categorie
        primary key (categorie_id)
        using index tablespace <votre_tbs_idx>
    )
    tablespace <votre_tbs_table>;
    -- Table created.
     
    create sequence seq_categorie;
    -- Sequence created.
     
    create trigger tbi_categorie_pk
    before insert on t_categorie
    for each row
    begin
        -- selon votre version, une des deux lignes suivantes est à utiliser, la seconde à partir de 11g
        -- select seq_categorie.nextval into :new.categorie_id from dual;
        :new.categorie_id := seq_categorie.nextval;
    end;
    /
    -- Trigger created.
     
    create view v_categorie (categorie_id, categorie_cd, categorie_nom) as
    select categorie_id
         , 'C' || to_char(categorie_id, 'fm00000')
         , categorie_nom
      from t_categorie;
    -- View created.
     
    insert into v_categorie (categorie_nom) values ('Catégorie 1');
    -- 1 row(s) inserted.
     
    insert into v_categorie (categorie_nom) values ('Catégorie 2');
    -- 1 row(s) inserted.
     
    insert into v_categorie (categorie_nom) values ('Catégorie 3');
    -- 1 row(s) inserted.
     
    select categorie_id, categorie_cd, categorie_nom from v_categorie;
     
    CATEGORIE_ID CATEGORIE_CD CATEGORIE_NOM
    ------------ ------------ -------------
               1 C00001       Catégorie 1
               2 C00002       Catégorie 2
               3 C00003       Catégorie 3
     
    -- Si vous comptez requêter sur le categorie_cd :
    create unique index ak_categorie
    on t_categorie ('C' || to_char(categorie_id, 'fm00000'))
    tablespace <votre_tbs_idx>;
    -- Index created.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2011
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Aaaaah ok. D'accord ! Merci pour la précisions ^^ Je retiens pour les prochaine fois. Désolée je savais pas du tout.

    Merci bien pour les commentaires et l'aide ! Je vais tester ça de suite.

    Merci beaucoup

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    @Waldar: j'aurais créé la clé Cxxxxx directement plutot que de passer par une vue. Ca ne brise rien d'imposer des contraintes sur la clé primaires:

    Donc
    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
    CREATE TABLE t_categorie
    ( categorie_id    varchar2  ( 6) CONSTRAINT pk_categorie PRIMARY KEY,
    , categorie_nom   varchar2(100) NOT NULL
    )
    -- Table created.
     
    CREATE sequence seq_categorie;
    -- Sequence created.
     
    CREATE TRIGGER tbi_categorie_pk
    before INSERT ON t_categorie
    FOR each row
    begin
        -- selon votre version, une des deux lignes suivantes est à utiliser, la seconde à partir de 11g
        -- select 'C' ||to_char(seq_categorie.nextval, 'fm00000') into :new.categorie_id from dual;
        :new.categorie_id := 'C' || to_char(seq_categorie.NEXTVAL, 'fm00000');
    end;
    Mais bon, les PK sur les varchar, c'est moche

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2011
    Messages : 40
    Points : 21
    Points
    21
    Par défaut
    Ah lol. Ca ne se fait pas trop ?

    Comment fait-on pour savoir notre version ? Si on a la 11g ou les anciennes ?
    (J'arrête de vous embêter après ^^)

  14. #14
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Mini_Croco Voir le message
    Comment fait-on pour savoir notre version ? Si on a la 11g ou les anciennes ?
    on demande au DBA

    ou, alternativement, on demande à la base de donnée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from v$version

  15. #15
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Mais bon, les PK sur les varchar, c'est moche
    Ah bon ? Et pourquoi ?
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  16. #16
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    @tchize> C'est vrai qu'au final on obtient le même résultat, mais stocker le C00002 prend plus de place que de ne stocker que l'id, et surtout le jour où la règle de gestion change, il est plus simple de modifier le code de la vue que de modifier le trigger et enchaîner des updates massifs.

    La remarque sur les PK varchar est vraie pour certains SGBD comme SQL-Server, MySQL et sûrement d'autres, par contre n'est pas vraie pour Oracle Database qui stocke de toutes façons ses nombres en chaînes de caractères et non pas en bits. Donc pas de différence notable en terme de performance où en place utilisée.
    Ce qu'il faut - et cette remarque est valide pour tous les SGBD - c'est que la progression de la clef soit monotone afin que l'index soit bien équilibré et présente un clustering factor contenu.
    Les séquences et autres clefs auto-incrémentées sont parfaites de ce point de vue et en font les meilleurs candidates à l'élaboration d'une clef primaire.

    N'oublions pas enfin de mettre les choses en perspective. Sur une table de référence de dix lignes, l'impact de tout ceci est insignifiant.

  17. #17
    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
    Citation Envoyé par Waldar;7175568...
    Ce qu'il faut - et cette remarque est valide pour tous les SGBD - c'est que la progression de la clef soit monotone afin que l'index soit bien équilibré et présente un clustering factor contenu.
    Les séquences et autres clefs auto-incrémentées sont parfaites de ce point de vue et en font les meilleurs candidates à l'élaboration d'une clef primaire.
    ....
    Le monotonie de la clef pose des problèmes. Comme l'index est trié tout le monde écrit en même temps dans le même block ce qui répresente un point de strangulation.

  18. #18
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Il est évident qu'on va gérer la DB différement suivant le ratio écriture / lecture

    A la base les bases de données type No SQL ont été créées à cause de ce genre de problème. Sur facebook, on en arrivait à des ratios proches de 1:1 dans les accès (traduction: personne ne lit ce que tu poste sur facebook :p)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Alimneter une table avec les champs d'une autre table selon critères
    Par tibao276 dans le forum Access
    Réponses: 2
    Dernier message: 28/02/2014, 21h26
  2. [XL-2010] Apparition d'une seule colonne selon critère
    Par PIETHI dans le forum Excel
    Réponses: 1
    Dernier message: 13/11/2013, 12h07
  3. Afficher une liste déroulante selon critère
    Par David1727 dans le forum Excel
    Réponses: 2
    Dernier message: 29/01/2013, 11h29
  4. OJB : générer une clé primaire via une séquence
    Par dams78 dans le forum Persistance des données
    Réponses: 1
    Dernier message: 25/08/2010, 09h52
  5. Générer une clef primaire aleatoire?
    Par 12_darte_12 dans le forum Administration
    Réponses: 4
    Dernier message: 18/07/2005, 18h10

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