2012-01-09 22 views
6

Negatif sayılara izin verilmeyen bir int alan mı? veya daha spesifik olarak, alana negatif bir sayı girildiğinde, bir sıfır ekler. Bunu soruyorum çünkü bir puanlama sistemimiz var ve insanların olumsuz skorlara sahip olmasına izin vermiyoruz. Eğer skorları körük sıfıra ulaşırsa, bunun yerine sadece bir sıfır ekler. Kullanıcının skorunu sorgulamak zorunda kalmadan, sıfırdan aşağı düşüp düşmeyeceğini kontrol etmeye çalışıyorum.mysql negatif sayıları önler

cevap

12

yapacaktır Başkalarının önerdiği DDL değişikliğine (INT UNSIGNED) ek olarak, uygulama mantığınızı da değiştirirdim. ki:

Ben feryat sıfır düşecek olmadığını kontrol etmek kullanıcının puanını sorgulamak zorunda kalmadan bunu yapmak için çalışıyorum

açıkça ayrı kontrol etmek gerekmez. sorgu:

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

Artık uygulamanız, score GÜNCELLEŞTİRME işlevini sıfırın altına düşürmeyebilir, ayrıca SQL moduna bağlı olarak hata veya uyarı üretemez.

+0

Bu çok yararlı bir fikir. Bazı alanları imzasız olarak değiştirdim ancak mevcut hata işleme yöntemlerini tetiklediler ve bunları kaldırmak zorunda kaldım. Bu, kontrol etmek için anlamsız bir sorgu/bağlantıdan kaçınmak için kullanışlıdır. – M1ke

9

Evet. int alanını oluşturabilir ve UNSIGNED olarak işaretleyebilirsiniz. MySQL 5.0 Reference Manual itibaren

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

Ancak, imzasız int sütununa tamsayı eklemek, hata atmayacaktır – Raaghu

4

MySQL tamsayı türleri için bir UNSIGNED ön eleme sahiptir.

Negatif değerler sıfıra sıkıştırılır, ancak bir uyarı oluşturur: Eğer sıkı sql modunda çalışıyorsa

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

Hata yakalamıyorsam, uyarı mysql hatası veriyor mu? – user962449

+0

@ user962449 Bilmiyorum, Böyle bir hata yakalamadım. Neden denemiyorsun? – Alnitak

1

bu bir hata ve başarısız olmasına neden olan ekleme/güncelleme atardı.

Genellikle bu tür bir şey için kullanıcı tanımlı bir işlev oluşturuyorum. (Bu durumda çok önemsiz "if (expr1, expr2, expr3)" hile