2012-01-20 17 views
5

Tôi đã từng nói rằng sẽ nhanh hơn khi chạy một chèn và để chèn không thành công hơn là kiểm tra xem một mục nhập cơ sở dữ liệu có tồn tại không và sau đó chèn nó nếu thiếu.Việc chèn mục nhập cơ sở dữ liệu mới nhanh hơn kiểm tra xem mục nhập có tồn tại trước không?

Tôi cũng được thông báo rằng hầu hết các cơ sở dữ liệu được tối ưu hóa rất nhiều cho việc đọc đọc thay vì viết, vì vậy sẽ không nhanh chóng kiểm tra nhanh hơn chèn chậm?

Đây có phải là câu hỏi về số lần va chạm dự kiến ​​không? (IE nó nhanh hơn để chèn chỉ khi có một cơ hội thấp của mục nhập đã tồn tại.) Liệu nó phụ thuộc vào kiểu cơ sở dữ liệu tôi đang chạy? Và cho rằng vấn đề, là nó thực hành xấu để có một phương pháp đó là sẽ được liên tục thêm chèn lỗi vào nhật ký lỗi của tôi?

Cảm ơn.

Trả lời

7

Nếu chèn sẽ bị lỗi do vi phạm chỉ mục, nó sẽ chậm nhất là chậm hơn kiểm tra xem bản ghi có tồn tại hay không. (Cả hai yêu cầu kiểm tra xem chỉ mục có chứa giá trị.) Nếu chèn sẽ thành công, sau đó phát hành hai truy vấn chậm hơn đáng kể so với việc phát hành một giá trị.

0

Bạn có thể sử dụng INSERT IGNORE để nếu khóa đã tồn tại, lệnh chèn sẽ bị bỏ qua, nếu không hàng mới sẽ được chèn vào. Bằng cách này, bạn cần phát hành một truy vấn đơn, kiểm tra các giá trị trùng lặp cũng chèn các giá trị mới.
vẫn Cẩn thận với INSERT IGNORE vì nó biến mọi lỗi thành cảnh báo. Đọc bài đăng này để chèn bỏ qua
On duplicate key ignore?

0

Tôi nghĩ rằng INSERT IGNORE INTO .... có thể được sử dụng ở đây, hoặc nó sẽ chèn hoặc bỏ qua nó. Nếu bạn sử dụng từ khóa IGNORE, các lỗi xảy ra trong khi thực hiện câu lệnh INSERT được coi là cảnh báo thay thế. Ví dụ, không có IGNORE, một hàng sao chép một chỉ mục UNIQUE hiện có hoặc giá trị PRIMARY KEY trong bảng gây ra một lỗi khóa trùng lặp và câu lệnh bị hủy bỏ. Với IGNORE, hàng vẫn không được chèn vào, nhưng không có lỗi nào được đưa ra.

0

Nếu bạn muốn xóa giá trị cũ và chèn một giá trị mới, bạn có thể sử dụng REPLACE Bạn có thể sử dụng REPLACE thay vì INSERT để ghi đè các hàng cũ.

THAY THẾ 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ư hàng mới cho khóa CHÍNH hoặc chỉ số UNIQUE, hàng cũ bị xóa trước khi hàng mới được chèn vào.

Khác sử dụng số INSERT IGNORE vì nó sẽ chèn hoặc bỏ qua.

hàng trùng lặp với chỉ mục UNIQUE hiện tại hoặc giá trị PRIMARY KEY trong bảng gây ra lỗi khóa trùng lặp và câu lệnh bị hủy. Với IGNORE, hàng vẫn không được chèn vào, nhưng không có lỗi nào được đưa ra.

0

Nếu bạn muốn chèn bản ghi nếu bản ghi mới của nó HOẶC Cập nhật hồ sơ nếu nó đã tồn tại thì làm thế nào để thực hiện UPSERT?

Check-out - http://vadivel.blogspot.com/2011/09/upsert-insert-and-update-in-sql-server.html

Thay vì kiểm tra xem kỷ lục tồn tại hay không chúng ta có thể cố gắng để cập nhật nó trực tiếp. Nếu không có hồ sơ phù hợp thì @@ RowCount sẽ là 0. Dựa trên đó chúng ta có thể chèn nó như là một kỷ lục mới.[Trong SQL Server 2008, bạn có thể sử dụng khái niệm MERGE cho việc này]

EDIT: Xin lưu ý, tôi biết điều này phù hợp với MS SQL Server và tôi không biết về MySQL hoặc ORACLE

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