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 :

[Oracle 10g] Mettre une des 2 colonnes NOT NULL


Sujet :

SQL Oracle

  1. #1
    Membre averti Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Points : 433
    Points
    433
    Par défaut [Oracle 10g] Mettre une des 2 colonnes NOT NULL
    Bonjour,

    J'aurai besoin de faire une table avec 2 identifiants, mais seulement un des 2 doit être renseigné au plus, mais également un des deux doit être renseigné au moins.

    J'aimerai donc mettre une contrainte sur mes colonnes :

    entite_id_1 is not nullable if entite_id_3 is null
    entite_id_2 is not nullable if entite_id_1 is null

    Savez-vous si cela est possible ?

    Merci.

  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
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par macben Voir le message
    entite_id_1 is not nullable if entite_id_3 is null
    entite_id_2 is not nullable if entite_id_1 is null
    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
     
    SQL> create table lsc_t(
      2    entite_id_1 number,
      3    entite_id_2 number,
      4    entite_id_3 number,
      5    constraint lsc_t_check1 check (entite_id_1 is not null or entite_id_3 is not null),
      6    constraint lsc_t_check2 check (entite_id_2 is not null or entite_id_1 is not null)
      7  );
     
    Table created.
     
    SQL> insert into lsc_t(entite_id_1,entite_id_2,entite_id_3) values (1,1,1);
     
    1 row created.
     
    SQL> insert into lsc_t(entite_id_1,entite_id_2) values (2,2);
     
    1 row created.
     
    SQL> insert into lsc_t(entite_id_1,entite_id_3) values (3,3);
     
    1 row created.
     
    SQL> insert into lsc_t(entite_id_2,entite_id_3) values (4,4);
     
    1 row created.
     
    SQL> insert into lsc_t(entite_id_1) values (5);
     
    1 row created.
     
    SQL> insert into lsc_t(entite_id_2) values (6);
    insert into lsc_t(entite_id_2) values (6)
    *
    ERROR at line 1:
    ORA-02290: check constraint (TGPOWNER.LSC_T_CHECK1) violated
     
     
    SQL> insert into lsc_t(entite_id_3) values (7);
    insert into lsc_t(entite_id_3) values (7)
    *
    ERROR at line 1:
    ORA-02290: check constraint (TGPOWNER.LSC_T_CHECK2) violated
     
     
    SQL> commit;
     
    Commit complete.

  3. #3
    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
    Points : 4 926
    Points
    4 926
    Par défaut
    J'aurai besoin de faire une table avec 2 identifiants, mais seulement un des 2 doit être renseigné au plus, mais également un des deux doit être renseigné au moins.
    bon, posé ainsi, ça change tout

    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
     
    SQL> create table lsc_t(
      2    x number,
      3    y number,
      4    constraint lsc_t_both_nulls check (x is not null or y is not null),
      5    constraint lsc_t_both_not_nulls check (x is null or y is null)
      6  );
     
    Table created.
     
    SQL> insert into lsc_t(x,y) values (1,1);
    insert into lsc_t(x,y) values (1,1)
    *
    ERROR at line 1:
    ORA-02290: check constraint (TGPOWNER.LSC_T_BOTH_NOT_NULLS) violated
     
     
    SQL> insert into lsc_t(x) values (2);
     
    1 row created.
     
    SQL> insert into lsc_t(y) values (3);
     
    1 row created.
     
    SQL> insert into lsc_t(x,y) values (null,null);
    insert into lsc_t(x,y) values (null,null)
    *
    ERROR at line 1:
    ORA-02290: check constraint (TGPOWNER.LSC_T_BOTH_NULLS) violated
     
     
    SQL> commit;
     
    Commit complete.

  4. #4
    Membre averti Avatar de macben
    Inscrit en
    Mars 2004
    Messages
    546
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2004
    Messages : 546
    Points : 433
    Points
    433
    Par défaut
    Merci ! (pour ta rapidité et tes réponses)

  5. #5
    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
    Avec une seule contrainte
    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
     
    Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0 
    Connected as mni
     
    SQL> 
    SQL> CREATE TABLE lsc_t(
      2    x number,
      3    y number,
      4    constraint lsc_t_un_de_deux CHECK ((x IS NOT NULL And y IS NULL) Or (x IS NULL And y IS NOT NULL))
      5  )
      6  /
     
    Table created
     
    SQL> INSERT INTO lsc_t(x,y) VALUES (1,1);
     
    INSERT INTO lsc_t(x,y) VALUES (1,1)
     
    ORA-02290: violation de contraintes (MNI.LSC_T_UN_DE_DEUX) de vérification
     
    SQL> INSERT INTO lsc_t(x) VALUES (2);
     
    1 row inserted
     
    SQL> INSERT INTO lsc_t(y) VALUES (3);
     
    1 row inserted
     
    SQL> INSERT INTO lsc_t(x,y) VALUES (NULL,NULL);
     
    INSERT INTO lsc_t(x,y) VALUES (NULL,NULL)
     
    ORA-02290: violation de contraintes (MNI.LSC_T_UN_DE_DEUX) de vérification
     
    SQL>

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Un léger avantage pour les deux contraintes (bien nommées) : on sait tout de suite pourquoi ça n'a pas fonctionné.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/10/2010, 14h47
  2. Installer Oracle 10g sur une machine ayant déja un Oracle 9i
    Par barcelone16 dans le forum Installation
    Réponses: 1
    Dernier message: 23/04/2008, 17h26
  3. Oracle 10g - Définir une colonne auto-incrémentée
    Par david71 dans le forum Oracle
    Réponses: 2
    Dernier message: 14/01/2008, 16h40
  4. [Oracle 10g] Accès à une BD Oracle10g installée sous Linux
    Par allyson dans le forum Administration
    Réponses: 2
    Dernier message: 13/05/2007, 15h56
  5. prob ajout de colonne ds une table en tant NOT NULL
    Par elhosni dans le forum Access
    Réponses: 3
    Dernier message: 19/11/2005, 22h18

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