2009-08-15 11 views
5

Comment puis-je démarrer une transaction en cas d'erreur dans les instructions SQL, le système annulera automatiquement les modifications?Transaction MySQL

J'ai l'instruction SQL suivante

START TRANSACTION; 

BEGIN; 

INSERT INTO `users`(id,name,gender,email,age) 
    VALUES(11121,'sss',0,'ssss',22); 

INSERT INTO `teachers`(`UserId`,`teachingSubject`) 
    VALUES(11121,300); 

COMMIT; 

Il ne rollback pas quand la deuxième contre-déclaration une erreur. Pourquoi? le 'teachingSubject' est TINYINT (2), la seconde instruction sera hors de sa portée. Je veux annuler toutes les déclarations.

Below is my procedure. 

mysql> source d:\s.sql 
Query OK, 0 rows affected (0.00 sec) 

Query OK, 0 rows affected (0.00 sec) 

Query OK, 1 row affected (0.00 sec) 

ERROR 1264 (22003): Out of range value for column 'te 
Query OK, 0 rows affected (0.09 sec) 

mysql> SELECT * FROM teachers 
    -> ; 
+--------+-----------------+ 
| UserId | teachingSubject | 
+--------+-----------------+ 
| 11111 |    1 | 
| 11112 |    9 | 
| 11113 |    100 | 
+--------+-----------------+ 
3 rows in set (0.00 sec) 

mysql> SELECT * FROM users; 
+-------+--------+--------+----------------+------+ 
| id | name | gender | email   | age | 
+-------+--------+--------+----------------+------+ 
| 11111 | Killer |  | [email protected]  | 12 | 
| 11112 | sss |  | ssss   | 22 | 
| 11113 | sss |  | ssss   | 22 | 
| 11114 | sss |  | ssss   | 22 | 
| 11115 | sss |  | ssss   | 22 | 
| 11116 | sss |  | ssss   | 22 | 
| 11117 | sss |  | ssss   | 22 | 
| 11118 | sss |  | ssss   | 22 | 
| 11119 | sss |  | ssss   | 22 | 
| 11120 | sss |  | ssss   | 22 | 
| 11121 | sss |  | ssss   | 22 | 
| 12345 | Sefler |  | [email protected] | 12 | 
+-------+--------+--------+----------------+------+ 
12 rows in set (0.00 sec) 

Aucun enregistrement avec id = 11121 dans la table des enseignants mais la table des utilisateurs le fait.

Répondre

5

MySQL ne lancera pas d'erreur lorsque l'int déborde. Au lieu de cela, il va juste le tronquer à la valeur la plus élevée possible. Dans le cas d'un tinyint non signé, c'est 255. Mais aucune erreur réelle ne sera lancée.

Questions connexes