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 :

Modification d'une clé primaire


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 15
    Par défaut Modification d'une clé primaire
    Bonjour tous le monde,

    je dois modifier une clé primaire qui est une clé étrangère dans d'autres tables.

    et j'ai l'erreur suivante :Violation de contrainte

    Est-ce que vous avez une idée sur la requête qui pourra modifier et la clé primaire dans la table ainsi que dans toutes les tables qu'il l'utilise comme clé étrangère?

    Merci bcp

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Il existe bien un DELETE CASCADE et DELETE SET NULLS mais pas de UPDATE CASCADE.

    Et je dois bien dire que c'est un peu problématique. Bon il existe quelques solutions :

    ex: deferable constraints

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    SQL> create table lsc_t1(
      2    x number primary key deferrable initially immediate);
     
    Table created.
     
    SQL> create table lsc_t2(
      2    y number primary key deferrable initially immediate,
      3    x number references lsc_t1 deferrable initially immediate);
     
    Table created.
     
    SQL> 
    SQL> insert into lsc_t1 values (1);
     
    1 row created.
     
    SQL> insert into lsc_t2 values (1,1);
     
    1 row created.
     
    SQL> commit;
     
    Commit complete.
     
    SQL> 
    SQL> update lsc_t1 set x=2;
    update lsc_t1 set x=2
    *
    ERROR at line 1:
    ORA-02292: integrity constraint (TGPOWNER.SYS_C001289362) violated - child record found
     
     
    SQL> update lsc_t2 set x=2;
    update lsc_t2 set x=2
    *
    ERROR at line 1:
    ORA-02291: integrity constraint (TGPOWNER.SYS_C001289362) violated - parent key not found
     
     
    SQL> rollback;
     
    Rollback complete.
     
    SQL> set constraints all deferred;
     
    Constraint set.
     
    SQL> update lsc_t1 set x=2;
     
    1 row updated.
     
    SQL> update lsc_t2 set x=2;
     
    1 row updated.
     
    SQL> commit;
     
    Commit complete.
     
    SQL> select * from lsc_t1;
     
             X
    ----------
             2
     
    SQL> select * from lsc_t2;
     
             Y          X
    ---------- ----------
             1          2

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 15
    Par défaut
    Merci pour votre réponse ,

    je vais essayé ça . mais comment on peut spécifier la contrainte quand veut déférer car ma base contient bcp de contraints ?

    et comment la rendre NOT DEFERRABLE après modification?

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    l'idée est d'avoir la contrainte INITIALY IMMEDIATE.

    Le SET CONSTRAINTS ALL DEFERRED n'est actif que le temps d'une transaction (après le commit, on revient à la valeur initiale). Cela ne modifie aucunement la contrainte, ça spécifie uniquement le mode de fonctionnement de la transaction en cours (et n'affecte donc pas les autres sessions).

    Tu peux aussi faire

    SET CONSTRAINT tacontrainte DEFERRED

  5. #5
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Cependant, hélas, on ne peux pas rendre une contrainte DEFERRABLE ou NOT DEFERABLE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SQL> create table lsc_t(x number, constraint lsc_t_pk primary key(x) not deferrable);
    Table created.
    SQL> set constraint lsc_t_pk deferred;
    ERROR at line 1:
    ORA-02447: cannot defer a constraint that is not deferrable
    SQL> alter table lsc_t modify constraint lsc_t_pk deferrable initially immediate;
    ERROR at line 1:
    ORA-00933: SQL command not properly ended
    SQL> alter table lsc_t drop constraint lsc_t_pk ;
    Table altered.
    SQL> alter table lsc_t add constraint lsc_t_pk primary key(x) deferrable initially immediate;
    Table altered.
    SQL> set constraint lsc_t_pk deferred;
    Constraint set.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 15
    Par défaut
    Merci bcp ,

    J'ai essayé et ça marche !!

    Merci mille fois

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

Discussions similaires

  1. Modification d'une clé primaire
    Par mehdiyou dans le forum SQL
    Réponses: 3
    Dernier message: 14/04/2008, 17h26
  2. Modification d'une clé primaire
    Par mehdiyou dans le forum Langage SQL
    Réponses: 5
    Dernier message: 12/04/2008, 18h10
  3. Probleme hibernate modification d'une clé primaire
    Par mrjeronimo dans le forum Hibernate
    Réponses: 3
    Dernier message: 24/03/2008, 17h33
  4. Modification d'une cle primaire chaine de charactere
    Par Contrec dans le forum Oracle
    Réponses: 7
    Dernier message: 01/08/2007, 08h15
  5. [Oracle] modification d'une clé primaire composée
    Par petburn dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/03/2006, 15h58

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