2009-08-15 9 views
5

システムが自動的に変更をロールバックするSQL文にエラーがある場合、どのようにトランザクションを開始できますか?トランザクションMySQL

私は2番目の文がエラーに対処するときにはロールバックしません。次の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; 

をしました。どうして? 'teachingSubject'はTINYINT(2)です.2番目のステートメントは範囲外になります。私はすべてのステートメントをロールバックしたい。

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) 

教師テーブルではid = 11121のレコードはありませんが、ユーザーテーブルではありません。

答えて

5

intがオーバーフローすると、MySQLはエラーをスローしません。代わりに、可能な限り高い値に切り捨てます。 255の符号なしtinyintの場合、実際のエラーはスローされません。

関連する問題