2009-08-15 34 views
5

Jak rozpocząć transakcję, gdy wystąpi błąd w instrukcjach SQL, system automatycznie wycofa zmiany?Transakcja MySQL

Mam następującą instrukcję SQL

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; 

To nie wycofać, gdy licznik drugie stwierdzenie błędu. Czemu? "teachingPodmiotem" jest TINYINT (2), drugie stwierdzenie wyczerpią się jego zakres. Chcę wycofać wszystkie instrukcje.

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) 

Brak rekordu o id = 11121 w tabeli nauczycieli, ale tabela użytkowników ma.

Odpowiedz

5

MySQL nie wyśle ​​błędu, gdy przepełni się int. Zamiast tego po prostu skróci to do najwyższej możliwej wartości. W przypadku unsigned tinyint to 255. Ale rzeczywisty błąd nie zostanie zgłoszony.