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

 MySQL Discussion :

champs obligatoire dans Mysql


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Jcpan
    Inscrit en
    Août 2008
    Messages
    542
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 542
    Par défaut champs obligatoire dans Mysql
    Bonjour

    Faut il qu'un champs sous mysql soit indexé pour qu'il soit obligatoire.

    Merci.

  2. #2
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 947
    Par défaut
    Non, ce n'est pas nécessaire...
    Il faut juste le déclarer NOT NULL.

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Et encore !
    En l'absence de valeur fournie dans la requête INSERT, une colonne (et pas un champ !) avec une contrainte NOT NULL prendra généralement une valeur par défaut.
    Extrait de la doc MySQL :
    Une valeur DEFAULT doit être une constante, ¸a ne peut être une fonction ou une expression. Cela signifie notamment que vous ne pouvez pas donner une valeur par défaut à une colonne de date, le résultat de la fonction NOW() ou CURRENT_DATE. Si aucune valeur par défaut (attribut DEFAULT) n'est spécifiée, MySQL en assigne une automatiquement
    Si la colonne accepte les valeur NULL, la valeur par défaut sera la valeur NULL.
    Si la colonne est déclarée comme NOT NULL (non-nulle), la valeur par défaut dépendra du type de colonne :

    • Pour les types numériques sans l'attribut AUTO_INCREMENT, la valeur sera 0. Pour une colonne AUTO_INCREMENT, la valeur par défaut sera la prochaine valeur de la série.
    • Pour les types dates et heures autres que TIMESTAMP, la valeur par défaut est la date zéro appropriée. Pour les colonnes TIMESTAMP, la valeur par défaut est la date et l'heure courante. See Section 11.3, « Les types date et heure ».
    • Pour les types de chaînes autres que ENUM, la valeur par défaut est la chaîne vide. Pour ENUM, la valeur par défaut est la première valeur de l'énumération.


    Les colonnes BLOB et TEXT ne peuvent pas recevoir de valeur par défaut.
    Quoi qu'il en soit, ça n'a rien à voir avec le fait qu'une colonne soit indexée ou non.
    Une colonne contenant des NULL peut très bien être indexée.
    A noter qu'en ce cas là, chaque NULL est considéré en principe comme différent. Mais je crois qu'on peut fixer un paramètre de MySQL pour lui dire de considérer tous les NULL comme équivalents, ce qui est faux sur le plan logique.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre éclairé
    Avatar de Jcpan
    Inscrit en
    Août 2008
    Messages
    542
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 542
    Par défaut
    Merci

    Mon besoin c'est que si la valeur de la colonne est vide il n'y aura pas d'insertion( une exception sera envoyé), je veux pas que le moteur insère une valeur par defaut (je veux pas aussi passer par un trigger). est ce possible ?

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Ca c'est plutôt au programme qui prépare la requête de le tester.

    Tu aurais pu ajouter une contrainte CHECK laColonne IS NOT NULL AND laColonne <> '' (pour une VARCHAR).
    Malheureusement, MySQL se fout royalement des contraintes CHECK qui font pourtant partie de la norme SQL.

    D'une manière générale, en supposant que les données à insérer proviennent d'un formulaire renseigné par l'utilisateur, c'est plutôt au programme qui génère et interprète le formulaire de vérifier que le formulaire est correctement rempli.

    Une contrainte CHECK dans un SGBD qui l'implémente va plutôt vérifier la cohérence de certaines données par rapport à une règle de gestion.
    Par exemple, si on enregistre la date de départ d'un salarié, il ne faut pas que cette date soit antérieure à sa date d'arrivée. Le fomulaire qui enregistre les départs des salariés s'assurera simplement que le champ date de départ soit bien renseigné.

    Avec MySQL, c'est au programme (et donc au programmeur) de se coltiner tout le boulot.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre éclairé
    Avatar de Jcpan
    Inscrit en
    Août 2008
    Messages
    542
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 542
    Par défaut
    Merci encore pour avoir pris le temps de répondre.

    Citation Envoyé par CinePhil Voir le message
    Ca c'est plutôt au programme qui prépare la requête de le tester.
    Oui mais on pourra pas dire que la base est solide dans ce cas et il y'aura beaucoup de bouleau dans la migration du langage du programme si nécessaire.
    Je verrai au coté de PostgreSQL.

  7. #7
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 947
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Et encore !
    En l'absence de valeur fournie dans la requête INSERT, une colonne (et pas un champ !) avec une contrainte NOT NULL prendra généralement une valeur par défaut.
    Voilà qui me parait très étonnant Je n'ai d'ailleurs rien vu dans la doc à ce propos...

    De fait, si MySQL réagissait ainsi, le prédicat [NOT] NULL ne pourrait plus être vérifié lors d'une requête...

  8. #8
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par qi130 Voir le message
    Voilà qui me parait très étonnant Je n'ai d'ailleurs rien vu dans la doc à ce propos...
    Tu n'as pas dû lire l'extrait de doc que j'ai cité alors !
    Il est dit entre autre :
    Si la colonne est déclarée comme NOT NULL (non-nulle), la valeur par défaut dépendra du type de colonne :
    Je te renvoie à l'extrait pour lire la suite !

    De fait, si MySQL réagissait ainsi, le prédicat [NOT] NULL ne pourrait plus être vérifié lors d'une requête...
    La contrainte NOT NULL sur une colonne veut dire que cette colonne doit toujours avoir une valeur. Dès lors, il faut bien qu'il y ait une valeur par défaut ! Soit le créateur de la table la définit avec le prédicat DEFAULT, soit MySQL se débrouille et la définit lui même.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 947
    Par défaut
    Au contraire, j'ai bien lu cet extrait qui explique la méthode employée par MySQL pour alimenter une colonne déclarée NOT NULL avec une clause DEFAULT
    Si aucune valeur par défaut (attribut DEFAULT) n'est spécifiée, MySQL en assigne une automatiquement...
    Pour le reste, je persiste. Cela permet par exemple de trouver une utilité à
    Error: 1048 SQLSTATE: 23000 (ER_BAD_NULL_ERROR)

    Message: Column '%s' cannot be null
    D'ailleurs ce "comportement" est facilement vérifiable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE  `test`.`ma_table1` (
      `cle1` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `donnee1` varchar(45) NOT NULL,
      PRIMARY KEY (`cle1`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    suivi de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    insert into ma_table1 values(0,null)
    donne bien
    Column 'donnee1' cannot be null

Discussions similaires

  1. Champ graphique dans MySQL
    Par chikha dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 21/05/2007, 20h03
  2. Réponses: 5
    Dernier message: 31/03/2007, 22h36
  3. champ interval dans mysql
    Par acipeg dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/12/2006, 11h44
  4. Champs obligatoires dans un formulaire
    Par sagitarium dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 23/05/2006, 16h55
  5. Champs obligatoires dans un formulaire
    Par glloq8 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 30/09/2005, 16h24

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