2009-03-30 37 views
23

Kinda lạ để đặt nó thành những từ ngắn gọn, heh.Tạo nếu mục nhập không tồn tại, nếu không cập nhật?

Dù sao, những gì tôi muốn về cơ bản là cập nhật một mục nhập trong bảng nếu nó tồn tại, nếu không hãy tạo một mục mới điền vào cùng một dữ liệu.

Tôi biết đó là dễ dàng, nhưng tôi tương đối mới để MySQL về bao nhiêu Tôi đã sử dụng nó: P

Trả lời

22

Sử dụng 'REPLACE INTO':

REPLACE INTO table SET id = 42, foo = 'bar'; 

Xem thêm trong số MySQL documentation

+0

Nó tạo nhiều hơn mục nhập cho người dùng REPLACE INTO SET ip = '$ uip', lastcheck = '$ tim' – unrelativity

+0

IS IP hoặc lastcheck hoặc là khóa chính hoặc chỉ mục duy nhất? – carl

+0

Sau đó, hành vi bạn đang trải qua được mong đợi. Một trường phải là chính hoặc duy nhất để làm việc này. Nếu không, làm cách nào MySQL biết để ngăn chặn các bản sao? Có vẻ như bạn nên có user_id trong bảng này (dưới dạng khóa chính) mà bạn cũng đặt trong thay thế của mình. – carl

2

Tra cứu REPLACE trong cuốn hướng dẫn MySQL.

REPLACE tác phẩm giống hệt như INSERT, trừ rằng nếu một hàng cũ trong bảng có giá trị tương tự như một hàng mới cho một PRIMARY KEY hoặc một chỉ số UNIQUE, các hàng cũ sẽ bị xóa trước khi mới hàng được gắn . Xem Phần 12.2.5, “INSERT Cú pháp”.

THAY THẾ là một phần mở rộng của MySQL cho tiêu chuẩn SQL . Nó chèn hoặc xóa và chèn. Đối với một phần mở rộng khác của MySQL đối với SQL chuẩn - chèn hoặc cập nhật - xem Section 12.2.5.3, “CHERTN ... ON Cú pháp chính của cú pháp khóa”.

Nếu bạn có các truy vấn INSERT sau:

INSERT INTO table (id, field1, field2) VALUES (1, 23, 24) 

Đây là REPLACE truy vấn bạn nên chạy:

REPLACE INTO table (id, field1, field2) VALUES (1, 23, 24) 
58

Rất nhiều nhà phát triển vẫn thực hiện truy vấn để kiểm tra xem một trường có nằm trong bảng không và sau đó thực thi truy vấn chèn hoặc cập nhật theo kết quả của truy vấn đầu tiên. Hãy thử sử dụng cú pháp NHẬT BẢN DU LỊCH, điều này nhanh hơn rất nhiều và tốt hơn sau đó thực hiện 2 truy vấn.Thông tin thêm có thể được tìm thấy here

INSERT INTO bảng (a, b, c) VALUES (4,5,6) ON DUPLICATE KEY CẬP NHẬT c = 9;

nếu bạn muốn giữ lại các giá trị tương tự cho c bạn có thể làm một bản cập nhật với giá trị tương tự

INSERT INTO bảng (a, b, c) VALUES (4,5,6) BẬT CẬP NHẬT CHÍNH C = 6;

sự khác biệt giữa 'thay thế' và 'trên khóa trùng lặp':

thay thế: chèn, hoặc xóa và chèn

trên khóa trùng lặp: chèn hoặc cập nhật

nếu bảng của bạn không có khóa chính hoặc khóa duy nhất, thay thế không có ý nghĩa gì.

Bạn cũng có thể sử dụng hàm VALUES để tránh phải chỉ định giá trị thực hai lần. Ví dụ. thay vì

INSERT INTO table (a,b,c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=6;

bạn có thể sử dụng

INSERT INTO table (a,b,c) VALUES (4,5,6) ON DUPLICATE KEY UPDATE c=VALUES(c);

đâu VALUES(c) sẽ đánh giá với giá trị quy định prevously (6).

+4

IMO, phản hồi này trả lời câu hỏi tốt hơn. Nếu bạn thực sự muốn một UPDATE khi hàng đã tồn tại, REPLACE là phá hoại: "REPLACE hoạt động chính xác như INSERT, ngoại trừ nếu hàng cũ trong bảng có cùng giá trị như một hàng mới cho một PRIMARY KEY hoặc một chỉ số UNIQUE, hàng cũ bị xóa trước khi hàng mới được chèn vào. " (Hướng dẫn sử dụng MySQL) – richardkmiller

+3

+1: câu trả lời tốt hơn nhiều so với câu trả lời được chấp nhận – mathieu

+0

Lưu ý rằng nó không chính xác "Chèn hoặc Cập nhật" nhưng "Chèn hoặc Xóa + Chèn" có nghĩa là đây không phải là giải pháp thích hợp nếu bạn muốn cập nhật một phần của các cột: không giống như bản cập nhật, giá trị của các cột không có giá trị được chỉ định sẽ được đặt thành giá trị mặc định (và sẽ bị mất) –

8

Như những người khác đã nói, REPLACE là cách để thực hiện. Tuy nhiên, hãy cẩn thận khi sử dụng nó vì nó thực sự thực hiện DELETEINSERT trên bàn. Điều này là tốt nhất của thời gian, nhưng nếu bạn có các phím nước ngoài với các ràng buộc như ON DELETE CASCADE, nó có thể gây ra một số vấn đề lớn.

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