SQL làm thế nào để tăng hoặc giảm một cho một cột int trong một lệnh


119

Tôi có một bảng Đơn hàng có cột Số lượng. Trong quá trình đăng ký hoặc thanh toán, chúng tôi cần cập nhật cột Số lượng đó theo từng cột. Có cách nào để làm điều này trong một hành động hay chúng ta phải lấy giá trị hiện có và sau đó thêm hoặc trừ đi một giá trị trên nó?

Một câu hỏi khác là khi chúng ta chèn một hàng mới, chúng ta có cần kiểm tra nếu cùng một dữ liệu hiện có sau đó chèn nếu không, đó là hai bước, hoặc có cách nào tốt hơn để làm điều này không?

cảm ơn,

Câu trả lời:


250

Để trả lời đầu tiên:

UPDATE Orders SET Quantity = Quantity + 1 WHERE ...

Để trả lời thứ hai:

Có nhiều hướng khác nhau để làm điều đó. Vì bạn không chỉ định cơ sở dữ liệu, tôi sẽ giả sử MySQL.

  1. INSERT INTO table SET x=1, y=2 ON DUPLICATE KEY UPDATE x=x+1, y=y+2
  2. REPLACE INTO table SET x=1, y=2

Cả hai đều có thể xử lý câu hỏi của bạn. Tuy nhiên, cú pháp đầu tiên cho phép linh hoạt hơn để cập nhật bản ghi thay vì chỉ thay thế nó (như cách thứ hai thực hiện).

Hãy nhớ rằng để cả hai tồn tại, phải có một khóa ĐỘC ĐÁO được xác định ...


32
Vì bạn không chỉ định cơ sở dữ liệu, bạn thực sự nên sử dụng SQL chuẩn.
paxdiablo

12

Câu trả lời một bước cho câu hỏi đầu tiên là sử dụng một cái gì đó như:

update TBL set CLM = CLM + 1 where key = 'KEY'

Đó là rất nhiều cách duy nhất để làm điều đó.

Đối với câu hỏi thứ hai, bạn không cần phải dùng đến thể dục dụng cụ SQL (như UPSERT) cụ thể của DBMS để có được kết quả như mong muốn. Có một phương pháp tiêu chuẩn để thực hiện cập nhật hoặc chèn mà không yêu cầu DBMS cụ thể.

try:
    insert into TBL (key,val) values ('xyz',0)
catch:
    do nothing
update TBL set val = val + 1 where key = 'xyz'

Đó là, bạn cố gắng thực hiện sáng tạo đầu tiên. Nếu nó đã ở đó, bỏ qua lỗi. Nếu không, bạn tạo nó với giá trị 0.

Sau đó thực hiện cập nhật sẽ hoạt động chính xác hay không:

  • hàng ban đầu tồn tại.
  • ai đó đã cập nhật nó giữa chèn và cập nhật của bạn.

Đó không phải là một hướng dẫn duy nhất, nhưng thật đáng ngạc nhiên, đó là cách chúng tôi đã thực hiện thành công trong một thời gian dài.


4

Nếu sự hiểu biết của tôi là chính xác, cập nhật sẽ khá đơn giản. Tôi sẽ chỉ làm như sau.

UPDATE TABLE SET QUANTITY = QUANTITY + 1 and
UPDATE TABLE SET QUANTITY = QUANTITY - 1 where QUANTITY > 0

Bạn có thể cần các bộ lọc bổ sung để chỉ cập nhật một hàng thay vì tất cả các hàng.

Đối với các phần chèn, bạn có thể lưu trữ một số id duy nhất liên quan đến bản ghi của mình cục bộ và kiểm tra bộ đệm này và quyết định có nên chèn hay không. Cách tiếp cận khác là luôn chèn và kiểm tra lỗi vi phạm PK và bỏ qua vì đây là phần chèn thừa.


4
UPDATE Orders Order
SET Order.Quantity =  Order.Quantity - 1
WHERE SomeCondition(Order)

Theo như tôi biết thì không có hỗ trợ tích hợp nào cho INSERT-OR-UPDATE trong SQL. Tôi đề nghị tạo một thủ tục được lưu trữ hoặc sử dụng truy vấn có điều kiện để đạt được điều này. Ở đây bạn có thể tìm thấy một bộ sưu tập các giải pháp cho các cơ sở dữ liệu khác nhau.


Bạn có thể gặp lỗi cú pháp khi ném từ dành riêng ĐẶT HÀNG như thế ...
gahooa

0

để trả lời thứ hai:

làm cho cột duy nhất và bắt ngoại lệ nếu nó được đặt thành cùng một giá trị.


0

@dotjoe Nó rẻ hơn để cập nhật và kiểm tra @@ rowcount, thực hiện chèn sau khi thực tế.

Các ngoại lệ đắt tiền && cập nhật thường xuyên hơn

Gợi ý: Nếu bạn muốn trở thành người biểu diễn uber trong DAL của mình, hãy tạo giao diện người dùng phía trước trong một ID duy nhất cho hàng được cập nhật, nếu không chèn.

Các DAL nên là CRUD, và không cần phải lo lắng về việc không quốc tịch.

Nếu bạn làm cho nó không trạng thái, Với các chỉ mục tốt, bạn sẽ không thấy khác biệt với câu lệnh SQL vs 1 sau đây. NẾU (chọn đầu 1 * mẫu x trong đó PK = @ ID) Chèn cập nhật khác

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.