Default Value
Par PlaceOweb le vendredi, juillet 3 2009, 23:24 - SQL - Lien permanent
La gestion des valeurs par défaut dans les champs de table sous MySQL. Comment éviter les erreurs :
Field 'typeText' doesn't have a default value
Environnement de test
- java 1.6.0_14
- mysql-connector-5.0.8-bin.jar
- mysql 5.0.32
mysql-connector-5.0.8-bin.jar
Le connecteur mysql 5.0.8 configure sa connexion tel que ci dessous avant toute requête exécutée. Notez l'importance du sql_mode='STRICT_TRANS_TABLES'
891653 Query SHOW SESSION VARIABLES 891653 Query SHOW COLLATION 891653 Query SET character_set_results = NULL 891653 Query SET autocommit=1 891653 Query SET sql_mode='STRICT_TRANS_TABLES' 891653 Query SHOW CREATE TABLE testDefaultValue 891653 Query DESCRIBE testDefaultValue
Les tests
Aucune valeur valeur par défaut de définie
INSERT 1
CREATE TABLE `testDefaultValue` ( `id` int(11) NOT NULL AUTO_INCREMENT, `typeVarChar` varchar(50) NOT NULL, `typeText` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Default Value'
INSERT INTO testDefaultValue (typeVarChar) VALUES ('myString');
Erreur SQL : Field 'typeText' doesn't have a default value
INSERT 2
CREATE TABLE `testDefaultValue` ( `id` int(11) NOT NULL AUTO_INCREMENT, `typeVarChar` varchar(50) NOT NULL, `typeText` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Default Value'
INSERT INTO testDefaultValue (typeText) VALUES ('myString');
Erreur SQL : Field 'typeVarChar' doesn't have a default value
Valeur définie à '' pour typeVarChar
INSERT 1
CREATE TABLE `testDefaultValue` ( `id` int(11) NOT NULL AUTO_INCREMENT, `typeVarChar` varchar(50) NOT NULL DEFAULT '', `typeText` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='Default Value'
INSERT INTO testDefaultValue (typeVarChar) VALUES ('myString');
Erreur SQL : Field 'typeText' doesn't have a default value
INSERT 2
CREATE TABLE `testDefaultValue` ( `id` int(11) NOT NULL AUTO_INCREMENT, `typeVarChar` varchar(50) NOT NULL DEFAULT '', `typeText` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Default Value'
INSERT INTO testDefaultValue (typeText) VALUES ('myString');
Nombre d'enregistrement modifiés : 1
Valeur NULL possible pour typeText
Le BLOB/TEXT ne permettant d'avoir de valeur par défaut, on le passe à "peut être NULL" qui à implicitement comme valeur par défaut NULL
ALTER TABLE testDefaultValue ALTER COLUMN typeText SET DEFAULT 'defaultValueText' ; -- BLOB/TEXT column 'typeText' can't have a default value ALTER TABLE `testDefaultValue` CHANGE `typeText` `typeText` TEXT NULL ;
INSERT 1
CREATE TABLE `testDefaultValue` ( `id` int(11) NOT NULL AUTO_INCREMENT, `typeVarChar` varchar(50) NOT NULL, `typeText` text, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='Default Value'
INSERT INTO testDefaultValue (typeVarChar) VALUES ('myString');
Nombre d'enregistrement modifiés : 1
Conclusion sur les valeurs par défaut des champs des tables des bases de données
Que faire ?
Faut il définir les valeurs par défaut ? à vide '', ou bien tout rendre NULL y compris les valeurs par défaut ?
En tout cas avec MySQL, si l'on veut définir des valeurs par défaut pour des champs de type TEXT ou BLOB, vous n'aurez pas d'autres chois que de le rendre NULL.
Quel impact d'avoir ses champs NULL ?
La valeur NULL signifie "pas de données" et est différente des valeurs comme 0 pour les nombres ou la chaîne vide pour les types chaîne. Voyez les problèmes avec les valeurs NULL.
Si vous voulez trouver les colonnes dont la valeur est NULL, vous ne pouvez pas utiliser le test =NULL. Pour trouver les valeurs NULL, vous devez utiliser le test IS NULL.
Le fait de définir ses champs avec comme valeur possible à NULL, vous impose d'enregistrer, lire et comparer cette valeur dans le code de vos applications. Écrire vos requêtes SQL avec la gestion du NULL et IS NULL est plus complexe qu'un simple '$value', mais heureusement, pour cela ils existe de bons API et de bons ORM.
Lors de l'utilisation de GROUP BY, toutes les valeurs NULL sont considérées comme égales.
Les fonctions agrégeantes comme COUNT(), MIN() et SUM() ignorent les valeurs NULL.
Comment faire la différence entre un champs sans valeur par défaut et une valeur par défaut vide '' ?
Si vous savez, je vous invite à nous le dire :) !
Ressources
MySQL
- MODIFY et ALTER TABLE Syntax : alter-table alter-table
- DESCRIBE Syntax (obtenir des informations sur les colonnes) : describe
- SHOW COLUMNS Syntax : show-columns show-columns
- SHOW CREATE TABLE Syntax : show-create-table show-create-table
- Data Type Default Values : data-type-defaults :
- If the column cannot take NULL as the value, MySQL defines the column with no explicit DEFAULT clause. For data entry, if an INSERT or REPLACE statement includes no value for the column, or an UPDATE statement sets the column to NULL, MySQL handles the column according to the SQL mode in effect at the time:
- If strict SQL mode is not enabled, MySQL sets the column to the implicit default value for the column data type.
- If strict mode is enabled, an error occurs for transactional tables and the statement is rolled back. For nontransactional tables, an error occurs, but if this happens for the second or subsequent row of a multiple-row statement, the preceding rows will have been inserted.
- If the column cannot take NULL as the value, MySQL defines the column with no explicit DEFAULT clause. For data entry, if an INSERT or REPLACE statement includes no value for the column, or an UPDATE statement sets the column to NULL, MySQL handles the column according to the SQL mode in effect at the time:
- Le mode SQL du serveur : server-sql-mode server-sql-mode
- Valeurs NULL : null-values null-values
- Problèmes avec les valeurs NULL : problems-with-null problems-with-null
Autres
- Alternative avec la suppression de la gestion du mode SQL Strict par commentcamarche.net en modifiant le my.cnf : sql-mode="
STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION". Même chose en anglais. - Un script de correction pour phpBB "Doesn't have a default value errors"
- Tutorial mysql-alter-command par