2009-12-19 5 views
0

J'ai accidentellement essayé d'insérer 'asdf' dans une colonne entière. Il a travaillé (mettre 0 dans la colonne), et a donné cet avertissement:Interdire l'insertion de valeurs de texte dans des colonnes entières

valeur entière incorrect: « asdf » pour colonne « Auteur » à la ligne 1

Comment puis-je faire des insertions similaires à échouer au lieu de simplement émettre un avertissement?

Répondre

4

MySQL 5.0, il y a une option sql_mode vous pouvez définir, que ce soit dans le my.cnf ou lors du démarrage (--sql-mode='<option>') ou lors d'une session en cours d'exécution. Lorsque vous réglez-le sur

sql_mode=STRICT_ALL_TABLES 

mysql n'émettra un avertissement et insérez la mauvaise valeur de toute façon, mais il refusera votre déclaration avec une erreur.

See also in the manual


Exemple:

mysql> create table asdf (id int); 
Query OK, 0 rows affected (0.13 sec) 

mysql> insert into asdf value ('Hello'); 
Query OK, 1 row affected, 1 warning (0.38 sec) 

mysql> show warnings; 
+---------+------+-----------------------------------------------------------+ 
| Level | Code | Message             | 
+---------+------+-----------------------------------------------------------+ 
| Warning | 1366 | Incorrect integer value: 'Hello' for column 'id' at row 1 | 
+---------+------+-----------------------------------------------------------+ 
1 row in set (0.02 sec) 

mysql> select * from asdf; 
+------+ 
| id | 
+------+ 
| 0 | 
+------+ 
1 row in set (0.03 sec) 

mysql> set SESSION sql_mode=STRICT_ALL_TABLES; 
Query OK, 0 rows affected (0.00 sec) 

mysql> insert into asdf value ('Hello'); 
ERROR 1366 (HY000): Incorrect integer value: 'Hello' for column 'id' at row 1 
mysql> 
+0

+1 pour l'exemple détaillé avant et après le réglage de l'option. – ripper234

+0

Dites ... comment exactement dois-je modifier le paramètre my.ini? J'ai essayé d'ajouter sql_mode = "STRICT_ALL_TABLES" dans la section [mysqld], mais cela n'a pas eu l'effet escompté. – ripper234

+0

(j'ai redémarré mysqld, bien sûr) – ripper234

1

Il suffit de lancer une erreur en utilisant raiseerror(). Il est utilisé comme un de mot-clé « jet » de la gestion des exceptions qui soulève une erreur sur certains modèle

SELECT 
case WHEN colname<>IsString(@columnName) 
THEN raiseerror() 
ELSE expression2 
END AS size 
FROM `mytab` 

Maintenant, créez un utilisateur fonction IsString() définie dans mon cas qui renvoie la valeur booléenne pour la chaîne de vérification. Si la valeur d'entrée est une chaîne, une erreur sera générée.

Check this thread to raise error

+0

Je suis désolé mais je ne comprends pas. Je voudrais que le moteur mysql lance cette erreur lorsque j'essaie d'insérer des données incorrectes. – ripper234

+0

vérifier, répondre mis à jour –

Questions connexes