2012-11-05 70 views

Trả lời

13

Bạn sẽ sử dụng từ khóa unsigned để biểu thị rằng số nguyên không cho phép một "dấu hiệu" (tức là - nó chỉ có thể là số dương) :

CREATE TABLE test (
    test_column int(11) unsigned 
); 

Bạn có thể đọc thêm về các loại dữ liệu số (ký & unsigned) here.

Theo như một thực tế chế để ngăn chặn sự chèn-các giá trị tiêu cực, MySQL có một điều khoản CHECK có thể được sử dụng trong báo cáo kết quả CREATE TABLE, tuy nhiên, theo các tài liệu:

CHECK mệnh đề được phân tích cú pháp nhưng bị bỏ qua bởi tất cả các công cụ lưu trữ.

Để tham khảo, đây là cách bạn sẽ sử dụng nó (và mặc dù nó sẽ thực hiện hoàn toàn tốt, nó chỉ không làm gì - như các tiểu bang thủ công):

CREATE TABLE test (
    test_column int(11) unsigned CHECK (test_column > 0) 
); 

CẬP NHẬT (từ chối giá trị âm hoàn toàn)
Tôi đã nhận thấy từ một vài nhận xét của bạn rằng bạn muốn các truy vấn có giá trị âm bị từ chối hoàn toàn và không được đặt thành 0 (dưới dạng giao dịch bình thường thành cột unsigned sẽ thực hiện). Không có ràng buộc nào có thể thực hiện điều này nói chung (ít nhất là tôi biết), nếu bạn bật chế độ nghiêm ngặt (với STRICT_TRANS_TABLES), bất kỳ truy vấn nào chèn một giá trị âm vào một cột không dấu sẽ bị lỗi (cùng với các lỗi chèn dữ liệu khác, chẳng hạn như giá trị enum không hợp lệ).

Bạn có thể kiểm tra nó bằng cách chạy lệnh sau đây trước khi bạn chèn-lệnh:

SET @@SESSION.sql_mode = 'STRICT_TRANS_TABLES'; 

Và nếu nó làm việc cho bạn, bạn có thể cập nhật cấu hình MySQL của bạn với sql-mode="STRICT_TRANS_TABLES" hoặc sử dụng SET @@GLOBAL.sql_mode = 'STRICT_TRANS_TABLES'; (Tôi không chắc chắn nếu lệnh SET sẽ ảnh hưởng đến cấu hình mysql toàn cục, vì vậy có thể tốt hơn để cập nhật tệp cấu hình thực).

+3

'unsigned' <> tích cực. 'unsigned' == không âm. – maxhb

0

Bạn nên sử dụng loại dữ liệu UNSIGNED INTEGER. Để biết thêm thông tin, click here

0

Cách khắc phục điều này là cho máy chủ MySQL biết rõ ràng để tạo một số nguyên không dấu.

CREATE TABLE tbl_example ( 
example_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
example_num INT UNSIGNED NOT NULL, 
example_text TEXT 
PRIMARY KEY (`example_id`) 
); 
+0

Đây là những gì tôi nhận được khi tôi chạy dưới đây phát biểu trên máy chủ mysql địa phương của tôi 'mysql> chèn vào giá trị thế giới (-2); ' ' Query OK, 1 hàng bị ảnh hưởng, 1 cảnh báo (0.01 giây)' – user462455

1

chỉ sử dụng unsigned để chỉ cho phép giá trị dương.

CREATE TABLE hello 
(
    world int unsigned 
); 

bỏ ghi chú dòng và bạn sẽ thấy những lỗi nói: liệu cắt ngắn: Out of giá trị phạm vi cho cột 'thế giới' tại dòng 1:

+0

Nhưng loại unsigned vẫn cho phép bạn chèn số nguyên âm (nó chuyển đổi số nguyên âm thành 0). Nó sẽ ném một cảnh báo, nhưng truy vấn vẫn đi qua – user462455

+0

Đây là những gì tôi nhận được khi tôi chạy các câu lệnh dưới đây trên máy chủ mysql cục bộ của tôi 'mysql> chèn vào giá trị thế giới (-2); ' ' Truy vấn OK, 1 hàng bị ảnh hưởng , 1 cảnh báo (0,01 giây) ' – user462455

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