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 :

[8] contrainte: champs null ou valeur presente dans table


Sujet :

Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 163
    Points : 80
    Points
    80
    Par défaut [8] contrainte: champs null ou valeur presente dans table
    salut

    je cherche à créer une table ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    create table societe (id number(2),
                          nom char(64),
                          maison_mere number(2),
                  edit:        primary key(id))
    et à mettre une contrainte sur le champs maison_mere pour vérifier que que la valeur de maison_mere soit présent dans le champs id de cette même table ou qu'il soit null.
    edit: une sorte de foreign key qui accepte null sur le champs maison_mere

    pouvez vous m'aidez?

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Est ce que la colonne "ID" est unique ?

    Si oui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE societe (	ID NUMBER(2) CONSTRAINT pk_ste PRIMARY KEY, 
                          	nom CHAR(64), 
                          	maison_mere NUMBER(2) )
    /
    ALTER TABLE societe
     ADD CONSTRAINT mm_ste FOREIGN KEY (maison_mere)  REFERENCES societe (ID)
    /
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 163
    Points : 80
    Points
    80
    Par défaut
    le problème avec ça c'est que la valeur null n'est pas accepté et que j'ai besoin du null pour mettre une societe sans parent

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Tu veux pouvoir mettre NULL dans quelles colonnes ?
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Si tous tes champs peuvent être NULL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE societe (   ID NUMBER(2), 
                             nom CHAR(64), 
                             maison_mere NUMBER(2) ) 
    /
    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
    CREATE OR REPLACE TRIGGER TRG_BEFORE_INSERT_SOCIETE
    BEFORE INSERT
    ON societe
    FOR EACH ROW
     
    DECLARE
     
    v_num NUMBER :=0;
    BEGIN
    	IF :NEW.maison_mere
    	IS NOT NULL
    	THEN
    		BEGIN
    				SELECT 1
    				INTO v_num
    				FROM societe 
    				WHERE ID = :NEW.maison_mere
    				AND ROWNUM = 1;
    			EXCEPTION WHEN NO_DATA_FOUND THEN RAISE;
    		  END;
     
    	END IF;	
    END;
    /
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 163
    Points : 80
    Points
    80
    Par défaut
    le champs id est la cle primaire, chaque société a un id.
    le nom ne sert à rien à la compréhension.
    le champs maison_mere indique l'id de la société dont la société dépend mais une société comme microsoft par exemple ne dépend de personne donc je souhaite pouvoir mettre null dans le champs maison_mere pour l'entreprise microsoft.

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Alors la contrainte devrait marcher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE societe 
     ADD CONSTRAINT mm_ste FOREIGN KEY (maison_mere)  REFERENCES societe (ID) 
    /
    Quel est ton message d'erreur à l'insertion ?
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 163
    Points : 80
    Points
    80
    Par défaut
    cette contrainte fonctionne mais ne fait pas ce que je veux:
    lors de l'insertion d'une société sans maison mere (maison_mere is null) alors le système recherche null dans la colonne id mais cle primaire oblige, il ne trouve pas de null du coup mon insertion est rejetée.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 138
    Points : 166
    Points
    166
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE societe
     ADD CONSTRAINT mm_ste FOREIGN KEY (maison_mere)  REFERENCES societe (ID)
    /
    cette contrainte fonctionne mais ne fait pas ce que je veux:
    lors de l'insertion d'une société sans maison mere (maison_mere is null) alors le système recherche null dans la colonne id mais cle primaire oblige, il ne trouve pas de null du coup mon insertion est rejetée.
    C'est une pratique très fréquente et très utilisée qui fait exactement ce que vous dites. Dans le cas où on insère une valeur sans maison mère, le système ne fait rien, il ne cherche pas pour null.

    Évidemment, la colonne doit être nullable, mais c'est le cas quand on ne spécifie pas explicitement NOT NULL dans le create table, ou quand on n'ajoute pas de contrainte not null par la suite.

    Il serait bon de voir le code d'erreur renvoyé par la BD quand vous l'obtenez.

  10. #10
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Donnes nous le DESC de la table, l'ordre d'INSERT et l'erreur.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 138
    Points : 166
    Points
    166
    Par défaut
    Juste en passant, tu vas avoir une erreur de table mutante avec ce trigger.

    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
    CREATE OR REPLACE TRIGGER TRG_BEFORE_INSERT_SOCIETE
    BEFORE INSERT
    ON societe
    FOR EACH ROW
     
    DECLARE
     
    v_num NUMBER :=0;
    BEGIN
       IF :NEW.maison_mere
       IS NOT NULL
       THEN
          BEGIN
                SELECT 1
                INTO v_num
                FROM societe
                WHERE ID = :NEW.maison_mere
                AND ROWNUM = 1;
             EXCEPTION WHEN NO_DATA_FOUND THEN RAISE;
            END;
     
       END IF;   
    END;
    /

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 163
    Points : 80
    Points
    80
    Par défaut
    wahhh je suis un naze vous avez raison.
    Le problème c'est que j'ai 3 foreign key dans ma table (pas celle que j'ai mis en exemple) et c'est pas le champs maison_mere qui pose problème.

    merci.

  13. #13
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

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

Discussions similaires

  1. Produit de somme de valeurs presentes dans une autre feuille
    Par seb1kl dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 25/05/2010, 10h08
  2. Remplir champ NULL par du contenu dans un INSERT
    Par Devilstuff dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/02/2010, 23h49
  3. Réponses: 4
    Dernier message: 25/04/2007, 16h23
  4. PB recherche si champ deja present dans table
    Par stan314 dans le forum Access
    Réponses: 1
    Dernier message: 28/05/2006, 17h19
  5. ADP filtrer si valeur presente dans sous-requette
    Par The Vandals dans le forum Access
    Réponses: 2
    Dernier message: 22/03/2006, 14h33

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