2012-01-09 28 views
6

Trường của họ có phải là trường int trong mysql không cho phép số âm? hoặc cụ thể hơn nếu một số âm được chèn vào trường, nó sẽ chèn một số không. Tôi hỏi điều này bởi vì chúng tôi có một hệ thống tính điểm và chúng tôi không cho phép mọi người có điểm số âm. Vì vậy, nếu điểm số của họ không đạt được dưới 0, nó sẽ chỉ chèn một số không thay thế. Tôi đang cố gắng để làm điều này mà không cần phải truy vấn điểm số của người dùng để kiểm tra xem nó sẽ giảm dưới không.mysql ngăn chặn số âm

Trả lời

12

Ngoài thay đổi DDL (INT UNSIGNED) mà người khác đã đề xuất, tôi cũng sẽ thay đổi logic ứng dụng của bạn. nói:

tôi đang cố gắng để làm điều này mà không cần phải truy vấn số điểm của người sử dụng để kiểm tra xem nó sẽ rơi dưới zero

Bạn không cần phải kiểm tra một cách rõ ràng trong một riêng biệt. truy vấn:

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

Hiện tại, ứng dụng của bạn không thể CẬP NHẬT score để giảm xuống dưới 0, cũng không tạo ra lỗi hoặc cảnh báo tùy thuộc vào chế độ SQL.

+0

Đây là một ý tưởng rất hữu ích. Tôi đã thay đổi một số lĩnh vực để unsigned nhưng họ kích hoạt phương pháp xử lý lỗi hiện có và tôi đã phải loại bỏ chúng. Điều này rất hữu ích để tránh truy vấn/kết nối vô nghĩa để kiểm tra. – M1ke

9

Có. Bạn có thể tạo trường int và đánh dấu nó là UNSIGNED.

enter image description here

Từ MySQL 5.0 Reference Manual:

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

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

Nhưng cố gắng chèn số nguyên vào cột int không dấu sẽ không ném lỗi – Raaghu

4

MySQL có một vòng loại UNSIGNED với nhiều loại nguyên.

giá trị âm sẽ được kẹp bằng không, nhưng sẽ tạo ra một cảnh báo:

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

Cảnh báo có gây ra lỗi mysql nếu tôi gặp lỗi không? – user962449

+0

@ user962449 Tôi không biết, tôi chưa bao giờ bật lỗi bắt như vậy. Tại sao bạn không thử nó? – Alnitak

1

Nếu bạn đang chạy trong chế độ nghiêm ngặt sql này sẽ ném ra một lỗi và chèn/cập nhật sẽ thất bại.

Tôi thường tạo một hàm do người dùng xác định cho loại điều này. (Trong trường hợp này, "if (expr1, expr2, expr3)" sẽ thực hiện thủ thuật

Các vấn đề liên quan