Tăng một trường cơ sở dữ liệu bằng 1


158

Với MySQL, nếu tôi có một trường, ví dụ như đăng nhập, làm thế nào tôi có thể cập nhật trường đó bằng 1 trong một lệnh sql?

Tôi đang cố gắng tạo một truy vấn INSERT, tạo ra FirstName, LastName và đăng nhập. Tuy nhiên, nếu sự kết hợp của FirstName và LastName đã tồn tại, hãy tăng số lần đăng nhập lên 1.

vì vậy bảng có thể trông như thế này ..

firstName----|----lastName----|----logins

John               Jones             1
Steve              Smith             3

Tôi theo lệnh mà khi chạy, sẽ chèn một người mới (ví dụ Tom Rogers) hoặc đăng nhập gia tăng nếu John Jones là tên được sử dụng ..

Câu trả lời:


287

Cập nhật một mục:

Một sự gia tăng đơn giản nên làm các thủ thuật.

UPDATE mytable 
  SET logins = logins + 1 
  WHERE id = 12

Chèn hàng mới hoặc Cập nhật nếu đã có:

Nếu bạn muốn cập nhật một hàng đã có trước đó hoặc chèn nó nếu nó chưa tồn tại, bạn có thể sử dụng REPLACEcú pháp hoặc INSERT...ON DUPLICATE KEY UPDATEtùy chọn (Như Rob Van Dam đã trình bày trong câu trả lời của anh ấy ).

Chèn một mục mới:

Hoặc có lẽ bạn đang tìm kiếm một cái gì đó như thế INSERT...MAX(logins)+1nào? Về cơ bản, bạn sẽ chạy một truy vấn giống như sau - có lẽ phức tạp hơn một chút tùy thuộc vào nhu cầu cụ thể của bạn:

INSERT into mytable (logins) 
  SELECT max(logins) + 1 
  FROM mytable

3
Ngoài ra, hãy chắc chắn để thêm mệnh đề WHERE phù hợp với ứng dụng của bạn.
BoltClock

Ồ thật đấy !! Tôi không biết bạn có thể làm điều đó !!! Vì vậy, điều này sẽ làm việc? XÁC NHẬN IGNORE mytable (FirstName, lastName, đăng nhập) GIÁ TRỊ (John, Smith, đăng nhập = đăng nhập + 1)
Matt

@Matt Không, đó là một INSERT, không phải một UPDATE. Nếu bạn muốn thực hiện thao tác chèn, bạn sẽ cần lấy max và thêm 1 vào đó.
Sampson

2
@Matt Câu hỏi của bạn đã hỏi "về việc cập nhật bằng 1", điều này gây ra sự nhầm lẫn. Tôi nghĩ rằng bạn có thể đang tìm kiếm một giải pháp khác, mà tôi đã tham khảo trong câu trả lời cập nhật của tôi.
Sampson

1
@Jonathan Xin lỗi vì sự nhầm lẫn .. Tôi đã cập nhật câu hỏi của mình, hy vọng điều đó rõ ràng hơn một chút ..
Matt

70

Nếu bạn có thể thực hiện một cách an toàn (FirstName, LastName) KEY PRIMARY hoặc ít nhất là đặt một khóa UNIITE cho chúng, thì bạn có thể làm điều này:

INSERT INTO logins (firstName, lastName, logins) VALUES ('Steve', 'Smith', 1)
ON DUPLICATE KEY UPDATE logins = logins + 1;

Nếu bạn không thể làm điều đó, thì bạn phải tìm nạp bất cứ khóa chính nào trước tiên, vì vậy tôi không nghĩ bạn có thể đạt được những gì bạn muốn trong một truy vấn.


1
Khóa chính 64+ byte không phải là một gợi ý tuyệt vời
Jon Black

Sẽ sử dụng một biến làm việc ở vị trí của '1'? tức là TRÊN KHAI THÁC CẬP NHẬT KHÓA đăng nhập = đăng nhập + numLogins; (tất nhiên được định dạng chính xác)
Matt

1
Coi chừng đó ON DUPLICATE KEY UPDATEkhông phải là bản sao hoàn toàn an toàn!
cilil

2

Bạn đã không nói những gì bạn đang cố gắng làm, nhưng bạn đã gợi ý nó đủ tốt trong các bình luận cho câu trả lời khác. Tôi nghĩ rằng bạn có thể đang tìm kiếm một cột tăng tự động

create table logins (userid int auto_increment primary key, 
  username varchar(30), password varchar(30));

sau đó không có mã đặc biệt là cần thiết khi chèn. Chỉ

insert into logins (username, password) values ('user','pass');

API MySQL có các chức năng cho bạn biết userid nào được tạo khi bạn thực thi câu lệnh này trong mã máy khách.


2

Tôi không phải là chuyên gia về MySQL nhưng có lẽ bạn nên xem xét các yếu tố kích hoạt, ví dụ TRƯỚC KHI CHỨNG MINH. Trong trình kích hoạt, bạn có thể chạy truy vấn chọn trên bảng gốc của mình và nếu tìm thấy thứ gì đó chỉ cần cập nhật hàng 'đăng nhập' thay vì chèn các giá trị mới. Nhưng tất cả điều này phụ thuộc vào phiên bản MySQL bạn đang chạy.


2

Đây là phần chú thích cho một số câu trả lời ở trên gợi ý việc sử dụng ON DUPLICATE KEY UPDATE, HÃY THỬ rằng đây KHÔNG phải lúc nào cũng an toàn, vì vậy nếu bạn có kế hoạch phát triển ngoài một máy chủ, bạn sẽ muốn tránh điều này và sử dụng hai truy vấn , một để xác minh sự tồn tại, và sau đó một giây để hoặc UPDATE khi một hàng tồn tại, hoặc INSERTkhi nó không.

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.