2012-02-13 68 views
6

Tôi có một bảng có 3 cột. Mỗi có một chỉ số duy nhất.Chèn nhiều MySQL khi không cho phép trùng lặp.

Tôi muốn thực hiện nhiều lần chèn cùng một lúc (300 ghi lại một cửa sổ bật lên). Khi một mục trùng lặp xảy ra, nó sẽ hủy bỏ toàn bộ phần chèn. Điều này có nghĩa là nếu 1 trong số 300 là một bản sao, thì không có mục nào trong số đó được chèn vào.

Có cách nào khác không?

Trả lời

8

Thử thay đổi truy vấn của bạn từ INSERT INTO ... thành INSERT IGNORE INTO .... Điều này sẽ gây ra bất kỳ lỗi nào để trở thành cảnh báo và các bản ghi khác của bạn sẽ được chèn vào.

+0

Cảm ơn, đã đi cho điều này. Dường như làm việc tốt. – Steve

0

Sử dụng một giao dịch: http://dev.mysql.com/doc/refman/5.0/en/commit.html

START TRANSACTION // DO QUERIES COMMIT

Nếu bất cứ điều gì đi sai trong DO VƯỚNG MẮC, không ai trong số các hồ sơ sẽ được cam kết.

Nếu bạn muốn bỏ qua lỗi. sử dụng - force từ dòng lệnh mysql của bạn

+0

Tôi nghĩ rằng OP muốn đối diện .... anh ấy đang thực hiện chèn nhiều và toàn bộ lệnh chèn đang chết do một bản ghi xấu. –

+0

Tôi đã cập nhật câu trả lời của mình để phản ánh điều này. –

1

Nếu chèn của bạn là idempotent, update or replace sẽ giúp bạn.

Vì chúng có khả năng không, không có cách siêu hiệu quả để thực hiện điều này mà không có thứ gì đó rơi xuống để chèn các hàng riêng lẻ làm dự phòng - để cách ly hàng lỗi.

Nếu bạn đang chèn hàng loạt để giảm độ trễ từ máy khách đến máy chủ, hãy cân nhắc sử dụng stored procedure để lấy hàng và chèn phía máy chủ lấy tất cả dữ liệu trong ảnh; có thể có dự phòng xử lý lỗi thích hợp trên cơ sở từng hàng.

Giả định rằng, tất nhiên, có một số xử lý lỗi có ý nghĩa có thể được thực hiện ở phía máy chủ mà không cần giao tiếp đồng bộ với máy khách.

0

Bạn có thể sử dụng một cái gì đó như thế này:

INSERT INTO table (username, id) 
      VALUES 
      ('john', 1), 
      ('jim', 2), 
      ('mary', 3), 
      ('jack', 4), 
      ('helen', 4) ON DUPLICATE KEY IGNORE 

Nếu bạn muốn nhập cảnh phải được thay thế, sử dụng CẬP NHẬT thay vì bỏ qua.

+0

MySQL không có 'ON DUPLICATE KEY IGNORE'. Nó chỉ hỗ trợ 'ON DUPLICATE KEY UPDATE'. –

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