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

Langage SQL Discussion :

Contrainte de variables NOT NULL


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 507
    Par défaut Contrainte de variables NOT NULL
    Bonjour,

    Je crée une table en SQL, j'ai 2 variables de ma table qui doivent être en NOT NULL exclusif, je m'explique:
    - elles ne doivent pas être toutes les 2 null
    - elles ne doivent pas être toutes les 2 not null
    donc si l'une est null l'autre doit être renseigné, et inversement.

    Comment exprimer cette contrainte en SQL lors de la création de la table ?

    Merci,

    Nico

  2. #2
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    7 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 7 271
    Par défaut
    Salut DiverSIG.

    Fusionne tes deux colonnes en une seul et ainsi elle ne sera jamais NULL mais toujours renseignée.
    Si tu dois distinguer leur origine, tu peux ajouter une colonne pour dire à qui appartient la valeur.

  3. #3
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 368
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 368
    Billets dans le blog
    17
    Par défaut
    Tu peux utiliser une contrainte de table et l'opérateur logique XOR.

    Avec MySQL :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create table test (
        id int primary key auto_increment,
        v1 int,
        v2 int,
        constraint `une seule colonne valorisée` check (v1 is not null xor v2 is not null)
    );
     
    insert into test set v1 = 123, v2 = null; -- OK
    insert into test set v1 = null, v2 = 234; -- OK
    insert into test set v1 = 123, v2 = 234; -- Error Code: 3819. Check constraint 'une seule colonne valorisée' is violated.
    insert into test set v1 = null, v2 = null; -- Error Code: 3819. Check constraint 'une seule colonne valorisée' is violated.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 022
    Billets dans le blog
    6
    Par défaut
    XOR n'existe pas en SQL.... Mais OR oui !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ...
        constraint CK_ALTERNATE_NOT_NULL check (v1 is null AND v2 is not null OR v1 is not null AND v2 is null)
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 716
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 716
    Billets dans le blog
    10
    Par défaut
    Effectivement XOR n'existe que dans le jargon MySQL/MariaDB, mais visiblement certains l'ignorent, j'en veux pour preuve les deux votes négatifs attribués à tort à la réponse de Fred (SQLPro).

  6. #6
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    7 271
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 7 271
    Par défaut
    Salut à tous.

    Code mysql : 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
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    USE `base`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`     integer unsigned NOT NULL auto_increment primary key,
      `v1`     integer unsigned     NULL,
      `v2`     integer unsigned     NULL,
       constraint `On_Col` check (v1 is not null xor v2 is not null)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`v1`,`v2`) values (123, null)
    --------------
     
    --------------
    insert into `test` (`v1`,`v2`) values (null,234)
    --------------
     
    --------------
    insert into `test` (`v1`,`v2`) values (234,456)
    --------------
     
    ERROR 3819 (HY000) at line 24: Check constraint 'On_Col' is violated.
    --------------
    insert into `test` (`v1`,`v2`) values (null,null)
    --------------
     
    ERROR 3819 (HY000) at line 25: Check constraint 'On_Col' is violated.
    --------------
    select * from `test`
    --------------
     
    +----+------+------+
    | id | v1   | v2   |
    +----+------+------+
    |  1 |  123 | NULL |
    |  2 | NULL |  234 |
    +----+------+------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    Je viens de le tester en reprenant l'exemple de Séb. et a priori le XOR existe bien sous Mysql.
    Sauf qu'il aurait été pertinent de préciser dans quel SGBDR nous devons résoudre cette contrainte.
    Sinon, oui, SQLPRO a raison de souligner que XOR n'existe pas en SQL.

    Pour revenir sur le problème soulevé par DiverSIG, je ne vois pas l'intérêt de créer deux colonnes sachant qu'on peut les fusionner en une seule.
    Ne serait il pas plus simple d'en créer une seule ?
    Mais vu les explications succinctes, il serait bien de détailler pourquoi cette contrainte
    Ne peut on pas faire autrement ?

Discussions similaires

  1. Contraint not null
    Par Vince7-7 dans le forum Oracle
    Réponses: 5
    Dernier message: 01/10/2007, 15h50
  2. [9i] Contrainte NOT NULL
    Par Ito dans le forum Administration
    Réponses: 20
    Dernier message: 11/07/2007, 14h13
  3. Ajouter une contrainte NOT NULL à une colonne
    Par abdelghani_k dans le forum Firebird
    Réponses: 1
    Dernier message: 03/06/2007, 17h26
  4. Création de table et contraintes : is null ou is not null ?
    Par GDMINFO dans le forum Langage SQL
    Réponses: 4
    Dernier message: 18/05/2007, 09h09
  5. Ajouter la contrainte NOT NULL a une colone [Firebird 1.5]
    Par crocodingo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/01/2004, 19h52

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