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 :

specification de contrainte de clé étrangère


Sujet :

SQL Oracle

Vue hybride

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 988
    Par défaut specification de contrainte de clé étrangère
    Bonjour,
    J'ai crée la table TITLE_COPY avec la syntaxe suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE title_copy (copy_id NUMBER(10),
    			title_id NUMBER(10)
    			CONSTRAINT title_copy_title_id_fk REFERENCES title(title_id),
    			STATUS VARCHAR2(15)
    			CONSTRAINT title_copy_status_nn NOT NULL
    			CONSTRAINT title_copy_status_ck CHECK(status IN('AVAILABLE','DESTROYED','RENTED','RESERVED')),
    			CONSTRAINT title_copy_copy_title_id_pk PRIMARY KEY(copy_id));
    On voit que la contrainte de clé étrangère est spécifiée simplement en indiquant CONSTRAINT title_copy_title_id_fk REFERENCES title(title_id),
    et pas CONSTRAINT title_copy_title_id_fk FOREIGN KEY( title_id)REFERENCES title(title_id).
    En effet, en utilisant la deuxième façon ( avec FOREIGN KEY) j'obtiens une erreur.

    Je remarque que lorsque je crée les contraintes tout à la fin comme dans cet exemple, je n'ai pas de problème( message d'erreur).
    Pouvez vous m'expliquer je reçois une erreur lorsque j'utilise la deuxième syntaxe( avec foreign key)sans être à la fin de la création de la table alors que je n'en reçois pas lorsque je crée la contrainte à la fin .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE RESERVATION (reservation_id number(10) NOT NULL ,
    			member_id NUMBER(10),
    			title_id NUMBER(10),
    			res_date DATE NOT NULL,
    			CONSTRAINT reservation_title_id_fk FOREIGN KEY(title_id) REFERENCES title(title_id),
    			CONSTRAINT reservation_member_id_fk FOREIGN KEY(member_id) REFERENCES member(member_id),
    			CONSTRAINT res_tit_rdate_mem_id_pk PRIMARY KEY(res_date,member_id,title_id,reservation_id ));
    Merci beaucoup à vous.
    Par ailleurs, si en créant les contraintes de primary key et foreign key je ne nomme pas expressement les contraintes, comment puis je les retrouver pour les supprimer.
    J'ai essayé de recupérer leur nom en allant par la commande suivante mais sans succès
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    select constraint_name, table_name, constraint_type from user_constraints;


    Pour finir, lorsqu'une contrainte est activée , la table correspondante est vérouillée jusqu'à ce que la vérifiçcation soit terminée.
    Cela signifie -t-il qu'aucun utilisateur ne peut mettre à jour des données dans la table avant que la verification par la contrainte ne soit effectuée.
    Si oui, est ce aussi valable pour la sélection, l'insertion (le verrouillage s'effectue t-il également pendant ces opérations).

    Merci beaucoup encore de votre aide.

    Cordialement.

    Nathalie

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Quelle est la version exacte d'Oracle qui est utilisée (4 chiffres SVP) ?

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    988
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 988
    Par défaut version d'oracle utilisée
    Bonsoir ,

    La version d'Oracle est 8i 8.1.7.0.0 ; j'ai fait le test avec la version 11g et le résultat est le même.

    Cordialement.
    Nathalie

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Si la contrainte de clé étrangère est définie au niveau de la colonne, il n'est pas nécessaire de définir quelle est la colonne concernée avec FOREIGN KEY. Par contre, si la colonne est définie au niveau de la table, il faut bien dire définir quelle est la colonne concernée (ou quelles sont les colonnes concernées) avec FOREIGN KEY.

    Si les contraintes ne sont pas nommées, il doit être possible de retrouver les colonnes concernées avec une jointure entre USER_CONSTRAINTS et USER_CONS_COLUMNS (testé avec Oracle 10.2.0.1/XE):

    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
     
      1  select cc.constraint_name, cc.column_name
      2  from user_cons_columns cc, user_constraints c
      3  where
      4* c.table_name = 'RESERVATION' and c.constraint_type='R' and cc.constraint_name = c.constraint_name
    SQL> /
     
    CONSTRAINT_NAME
    ------------------------------
    COLUMN_NAME
    --------------------------------------------------------------------------------
    SYS_C005414
    MEMBER_ID
     
    SYS_C005415
    TITLE_ID
    Du point de vue du verrouillage, une instruction SELECT (sauf avec for UPDATE) ne verrouille pas de ligne dans les tables de la clause FROM. INSERT, UDPATE, DELETE sur une table enfant n'entraînent pas de verrouillage exclusif au niveau de la table enfant (qu'il y ait une clé étrangère ou non) mais un verrouillage exclusif des lignes concernées dans la table enfant. Par contre, si la clé étrangère n'est pas indexée, il peut y avoir des verrous sur la table enfant lorsque la table parent est modifiée: exemple en 10.2: http://download.oracle.com/docs/cd/B...htm#sthref3103

  5. #5
    Expert confirmé 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
    Par défaut
    Citation Envoyé par pifor Voir le message
    ... Par contre, si la clé étrangère n'est pas indexée, il peut y avoir des verrous sur la table parent.
    Salut pifor,

    Les modifications sur la table parent peuvent impliquer des verrous sur la table fille mais pas le contraire, donc peux-tu donner un exemple ?

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Salut mnitu,

    En effet je me suis trompé. Merci pour la correction.

Discussions similaires

  1. Double contrainte de clé étrangère
    Par eperdu dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 21/04/2010, 15h49
  2. Réponses: 29
    Dernier message: 25/11/2007, 16h08
  3. [Débutant ACCESS] Contrainte de clés étrangères
    Par elgringo2007 dans le forum Access
    Réponses: 2
    Dernier message: 12/06/2006, 18h56
  4. Réponses: 5
    Dernier message: 28/04/2006, 11h55
  5. Contraintes de clés étrangères non respectées
    Par parfait dans le forum Requêtes
    Réponses: 7
    Dernier message: 28/07/2004, 12h48

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