2012-07-15 76 views
13

Có cách nào xóa bản ghi trên khóa trùng lặp trong MySQL không?MySQL chèn vào khóa trùng lặp; xóa bỏ?

Giả sử chúng tôi có một bản ghi trong cơ sở dữ liệu với khóa chính cụ thể và chúng tôi cố gắng thêm một khóa khác có cùng khóa - ON DUPLICATE KEY UPDATE sẽ chỉ cập nhật bản ghi, nhưng có tùy chọn xóa bản ghi nếu đã tồn tại không? Đó là chức năng vào/ra đơn giản chỉ bằng một cú nhấp chuột.

+3

Sử dụng ** trigger ** – rekenerd

+0

Cảm ơn - Tôi nghĩ đó là tùy chọn duy nhất. –

Trả lời

1

Giải pháp có thể gần nhất cho cùng một câu hỏi là REPLACE. Đây là số documentation for REPLACE.

Câu hỏi tương tự đã được hỏi trên MySQL Forumsrecommended(and only) answer là sử dụng REPLACE.

+0

Có, nhưng đó không phải là những gì tôi đang tìm kiếm - Tôi không muốn thay thế các mục trong cơ sở dữ liệu - nếu nó tồn tại tôi muốn thoát khỏi nó tất cả cùng nhau. –

+0

Tôi đoán tùy chọn duy nhất (nếu ở trên là giải pháp duy nhất có thể) trong trường hợp đó sẽ là chạy các câu lệnh riêng biệt - trước tiên hãy kiểm tra xem bản ghi có được tìm thấy sau đó dựa trên kết quả hoặc thêm nó hay xóa nó. –

+0

hoặc tạo cột 'BOOLEAN' hoặc' ENUM' và đặt 0 hoặc 1, tùy thuộc vào bạn muốn hay không. – hjpotter92

4

Sử dụng REPLACE INTO:

replace into some_table 
select somecolumn from othertable 

hoặc sẽ chèn dữ liệu mới hoặc nếu Thr dữ liệu cùng tồn tại sẽ xóa các dữ liệu và chèn mới một

+1

Hiệu suất thay thế vào so với ON ONPLATEATE UPDATE, là khác nhau. REPLACE INTO không cập nhật bản ghi - nó xóa bản ghi và thêm lại, nếu bạn có rất nhiều dữ liệu và chỉ mục liên quan, có thể mất một lúc ... tốt hơn để sử dụng ON DUPLICATE UPDATE, nhưng anh ấy yêu cầu XÓA một cái gì đó như BẬT GHI DANH CHẤP NHẬN –

-2

Có tất nhiên có một giải pháp trong MySQL cho vấn đề của bạn .

Nếu bạn muốn xóa hoặc bỏ qua các bản ghi chèn mới nếu đã có một kỷ lục trùng lặp tồn tại trong cột chính của bảng, bạn có thể sử dụng bỏ qua như thế này:

insert ignore into mytbl(id,name) values(6,'ron'),(7,'son'); 

Đây id cột là khóa chính trong bảng mytbl. Thao tác này sẽ chèn nhiều giá trị trong bảng bằng cách xóa hoặc bỏ qua các bản ghi trùng lặp mới.

Hy vọng điều này sẽ đáp ứng yêu cầu của bạn.

+1

chèn bỏ qua KHÔNG xóa bất cứ điều gì –

5

Đó là một công việc xung quanh, nhưng nó hoạt động:

Tạo một cột mới và gọi nó là do_delete, hoặc bất cứ điều gì, làm cho nó một tí hon-int. Sau đó, hãy thực hiện On Duplicate Key Update do_delete = 1;

Tùy thuộc vào phiên bản/kết nối MySQL của bạn, bạn có thể thực hiện nhiều truy vấn trong cùng một câu lệnh. Tuy nhiên, nếu không, chỉ cần chạy một truy vấn riêng biệt ngay lập tức sau khi từ. Dù bằng cách nào, truy vấn tiếp theo sẽ chỉ là: Delete From [table] Where do_delete = 1;. Bằng cách này, nếu một mục mới của nó, nó sẽ không xóa bất cứ điều gì. Nếu nó không phải là một mục mới, nó sẽ đánh dấu nó để xóa sau đó bạn có thể xóa nó.

+0

Tôi thích tùy chọn này - và sẽ không cần phải thay đổi câu lệnh cập nhật của tôi. – ChiMo

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