MySQL: Làm thế nào để giảm một cột int không dấu?


7

Tôi có một bảng với một cột unsigned int, hãy đặt tên là col1.

Tôi muốn giảm số cột theo một số, nếu giá trị sau khi giảm nhỏ hơn 1 thì đặt thành 1. Như thế này:

UPDATE `tbl1` SET `col1` = GREATEST(1, `col1`-3);

Điều này hoạt động tốt, nhưng nếu col1 là 0 hoặc 1 hoặc 2 và tôi cố gắng làm -3 thì MySQL sẽ báo lỗi.

Tôi đã thử cái nàycái này nhưng không hiệu quả.


Lỗi gì?? Có lẽ liên quan đến UNSIGNED?
Rick James

@RickJames, tôi biết, vì UNSIGNEDkhông cho phép các giá trị âm.
evilReiko

Câu trả lời:


5

Bạn có thể sử dụng một casemệnh đề

update tbl1 set col1 =  (case when col1 <= 3 then 1 else (col1 - 3) end);

Như @RDFozz đã mô tả:

Với mã được liệt kê của OP, col1 - 3 phải được tính toán và vì đó là số nguyên không dấu, kết quả phải là số nguyên không dấu. Mã này ngăn việc tính toán xảy ra trừ khi kết quả thực sự sẽ là một số nguyên không dấu.

CẬP NHẬT:

Một cách khác có thể được đề xuất bởi @kondybas

update tbl1 set col1 = IF(col1<=3, 1, col1-3);

2
Điểm tuyệt vời. Với mã được liệt kê của OP, col1 - 3phải được tính toán và vì đó là số nguyên không dấu, kết quả phải là số nguyên không dấu. Mã thay thế của bạn ngăn việc tính toán xảy ra trừ khi kết quả thực sự sẽ là một số nguyên không dấu.
RDFozz

2
Cách tiếp cận khác là sử dụng IF()chức năng:SET col1 = IF(col1<3, 1, col1-3)
Kondybas

Câu trả lời của DEatTh và @Kondybas đều đúng và hoạt động như mong đợi, mặc dù tôi thích câu trả lời của Kondybas hơn vì nó có vẻ dễ đọc hơn đối với tôi.
evilReiko

Để phù hợp với điều kiện ..if value after decrement is less than 1 then set it to 1., sau đó tôi đã sử dụng <= 3thay vì< 3
evilReiko

2

nếu giá trị sau khi giảm nhỏ hơn 1 thì đặt nó thành 1.

Chỉ cần thêm một WHEREtuyên bố

UPDATE tbl1
  SET col1 = col1 - 1
WHERE col1 >= 2;

Câu trả lời tốt. Nhưng trong trường hợp của tôi, số - 1là một biến số, nó có thể là bất kỳ số nào (-1, -2, -3, v.v.), vậy làm thế nào để làm điều đó?
evilReiko

1
UPDATE tbl1 SET col1 = col1 - $var WHERE col1 >= $var + 1;
Evan Carroll

Điều đó không hoạt động như mong đợi: nếu col1 là 2 và tôi cố gắng làm -3, như thế này : UPDATE tbl1 SET col1 = col1 - 3 WHERE col1 >= 4;, thì col1 sẽ vẫn là 2 thay vì được cập nhật thành 1
evilReiko

2

Một cách khác để lột da con mèo này:

UPDATE tbl1 SET col1 = GREATEST(4, col1) - 3

Có thể hiệu quả hơn:

UPDATE tbl1 SET col1 = GREATEST(4, col1) - 3
    WHERE col1 > 1;

1

Giá trị tối thiểu mà giá trị unsigned intcó thể có là 0, bạn không thể đặt giá trị âm thành trừ khi được ký. Bạn cần triển khai logic để xử lý các giá trị trong cột để bạn GREATEST(1, 'col1'-3)không vi phạm quy tắc. CASE WHENtrong câu lệnh đó có thể hoạt động cũng như lấy ra một tập hợp con được lọc của dữ liệu với một truy vấn con.

Tài liệu tham khảo MySQL

Tham chiếu ngăn xếp chồng

Bạn cũng có thể sử dụng int unsign của mình dưới dạng int đã ký và sau đó thực hiện số học.

Tham chiếu ngăn xếp chồng lên nhau khi truyền tới đã ký

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.