2009-08-16 39 views
23

Khi chèn dữ liệu vào bảng có PK tăng tự động, tôi cần lấy khóa đó để sử dụng trong một câu lệnh khác. Như nhiều câu hỏi hiển thị trên SO, điều này có thể được thực hiện bằng PHP sử dụng mysql_insert_id().Lấy id được chèn cuối cùng cho nhiều hàng

Tuy nhiên, tôi đã nhóm các chèn của tôi lại với nhau để tôi chèn nhiều hơn một hàng cùng một lúc. Tôi đã làm điều này như tôi đoán có lẽ sẽ có một số vấn đề hiệu suất, xin vui lòng tư vấn cho tôi nếu tôi sai. Dù sao, theo như tôi biết, tuy nhiên, mysql_insert_id() chỉ trả về id cuối cùng, khi tôi cần id cho tất cả các hàng được chèn.

Tôi đoán trong trường hợp này tôi có thể:

  1. Do một số toán học đơn giản để tính toán tất cả các id sử dụng mysql_insert_id() và số hàng tôi đã nhập. Nhưng liệu điều này có được đảm bảo đúng không?

  2. Sử dụng báo cáo nhiều chèn, một cho mỗi hàng

  3. Tạo ID của tôi trước và không sử dụng auto-increment.

Tôi chắc chắn đây phải là vấn đề kinh điển, vì vậy tôi tự hỏi về cách tiếp cận phổ biến nhất và được khuyến khích là gì.

Trả lời

2

Có một vài phương pháp mà tôi muốn sử dụng, nếu tôi là tôi:

Thứ nhất, có những lĩnh vực CreateDate với một mặc định của CURRENT_TIMESTAMP phương pháp. Về cơ bản, bạn chọn CURRENT_TIMESTAMP để có được ngày, chạy chèn, sau đó select id from table where CreateDate > $mytimestamp.

Thứ hai, bạn có thể tạo trình kích hoạt trên bảng để đăng nhập after insert và đặt các ID mới trong một bảng kiểm tra nhỏ. Tuy nhiên, hãy cắt bớt bảng trước khi kiểm tra các ID đó. Tôi sẽ sử dụng phương pháp này nếu bảng của bạn là hàng triệu hàng triệu hàng.

+0

Phương pháp 'CURRENT_TIMESTAMP' có vẻ hơi nguy hiểm đối với tôi. Nếu bạn và người khác viết cùng một bảng cùng một lúc (cùng một dấu thời gian) thì sao? – tonix

32

Gọi last_insert_id() cung cấp cho bạn id của hàng FIRST được chèn vào trong lô cuối cùng. Tất cả những thứ khác được chèn vào, được đảm bảo tuần tự.

Trừ khi bạn đang làm điều gì đó rất lạ, điều này cho phép bạn tính toán ID của mỗi hàng một cách dễ dàng đủ.

Thực tế, hành vi này thay đổi tùy theo cài đặt của tham số chế độ tăng tự động innodb; điều này không quan trọng. Miễn là bạn không thay đổi nó từ mặc định, bạn sẽ thấy hành vi mong đợi.

Có những trường hợp không thường xuyên mà điều này không làm những gì bạn mong đợi và không hữu ích - chẳng hạn như nếu bạn thực hiện ON ONPLAYATE KEY UPDATE hoặc INSERT IGNORE. Trong những trường hợp này, bạn sẽ cần phải làm một cái gì đó khác để tìm ra các ID của mỗi hàng.

Nhưng đối với một lô INSERT vani đơn giản, không có giá trị được chỉ định cho cột tự động inc, thật dễ dàng.

Mô tả đầy đủ về cách auto-increments are handled in innodb is here

+1

Tôi giả định InnoDB, bởi vì hầu hết các ứng dụng nên sử dụng InnoDB, nó là động cơ có mục đích chung tốt nhất. – MarkR

+0

Đối với động cơ có khóa cấp bảng (bộ nhớ, myisam vv), tự động inc là tầm thường, vì không có đồng thời để lo lắng về. – MarkR

+0

Đây là những gì tôi nghĩ bằng cách 'làm một số môn toán'. Là hỗn loạn sai sau đó bằng cách nói rằng nó không đảm bảo được tuần tự? hoặc có lẽ anh ta hiểu lầm tôi – zenna

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