2012-01-09 16 views
6

mysqlのintフィールドは負の数が許されていませんか?より具体的には、負の数がフィールドに挿入されている場合は、ゼロを挿入します。私たちはスコアリングシステムを持っており、人々が否定的なスコアを持つことを許さないので、私はこれを尋ねます。だから、彼らのスコアが0になったら、代わりにゼロを挿入するだけです。私はこれを行うには、ユーザーのスコアを照会することなく、それがゼロになるかどうかをチェックすることを試みている。mysqlは負の数を防ぎます

答えて

12

他人が推薦しているDDLの変更(INT UNSIGNED)に加えて、アプリケーションロジックも変更します。言う:

私はそれが怒鳴るゼロに落ちるかどうかを確認するために、ユーザーのスコアを照会することなく、これをやろうとしている

あなたは別々に明示的にチェックする必要はありません。クエリ:

UPDATE your_table 
    SET score = GREATEST(score + ?, 0) -- This '?' is the adjustment to the score 
WHERE user_id = ? 

アプリケーションでscoreをゼロ以下に更新することはできません。また、SQLモードによってエラーや警告が生成されることもありません。

+0

これは非常に便利なアイデアです。いくつかのフィールドを符号なしに変更しましたが、既存のエラー処理メソッドをトリガし、それらを削除する必要がありました。これは、チェックする無意味なクエリ/接続を避けるために便利です。 – M1ke

9

はい。 intフィールドを作成し、UNSIGNEDとマークすることができます。 MySQL 5.0 Reference Manualから

enter image description here

INT[(M)] [UNSIGNED] [ZEROFILL] 

A normal-size integer. The signed range is -2147483648 to 2147483647. 
The unsigned range is 0 to 4294967295. 
+0

しかし、符号なしint列に-ve整数を挿入しようとするとエラーがスローされません – Raaghu

4

MySQLは整数型のためUNSIGNED修飾子を持っています。

負の値はゼロにクランプされますが、警告を生成します:あなたは、厳密なSQLモードで実行している場合は

mysql> create table test (id int(5) unsigned not null); 
Query OK, 0 rows affected (0.05 sec) 

mysql> insert into test values (-1), (5), (10); 
Query OK, 3 rows affected, 1 warning (0.01 sec) 
Records: 3 Duplicates: 0 Warnings: 1 

mysql> select * from test; 
+----+ 
| id | 
+----+ 
| 0 | 
| 5 | 
| 10 | 
+----+ 
3 rows in set (0.01 sec) 
+0

エラーが発生した場合、警告によりmysqlエラーが発生しますか? – user962449

+0

@ user962449私は知らない、私はそれをキャッチエラーを有効にしたことはありません。なぜあなたはそれを試してみませんか? – Alnitak

1

が、これはエラーと失敗する挿入/更新をスローしていました。

私はこの種のもののためにユーザ定義関数を作成します。 (この場合、非常に些細な "if(expr1、expr2、expr3)"はトリックを行います

関連する問題