Bonjour
Faut il qu'un champs sous mysql soit indexé pour qu'il soit obligatoire.
Merci.
Bonjour
Faut il qu'un champs sous mysql soit indexé pour qu'il soit obligatoire.
Merci.
Non, ce n'est pas nécessaire...
Il faut juste le déclarer NOT NULL.
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 :
Quoi qu'il en soit, ça n'a rien à voir avec le fait qu'une colonne soit indexée ou non.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.
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 !
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 ?
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 !
Tu n'as pas dû lire l'extrait de doc que j'ai cité alors !
Il est dit entre autre :
Je te renvoie à l'extrait pour lire la suite !Si la colonne est déclarée comme NOT NULL (non-nulle), la valeur par défaut dépendra du type de colonne :
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.De fait, si MySQL réagissait ainsi, le prédicat [NOT] NULL ne pourrait plus être vérifié lors d'une requête...
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 !
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
Pour le reste, je persiste. Cela permet par exemple de trouver une utilité àSi aucune valeur par défaut (attribut DEFAULT) n'est spécifiée, MySQL en assigne une automatiquement...D'ailleurs ce "comportement" est facilement vérifiable :Error: 1048 SQLSTATE: 23000 (ER_BAD_NULL_ERROR)
Message: Column '%s' cannot be null
suivi de
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;donne bien
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 insert into ma_table1 values(0,null)Column 'donnee1' cannot be null
Partager