2013-01-09 33 views
5

Tôi có một bảng có một cột với AUTO INCREMENT. Tôi phải lấy giá trị của cột này khi chèn một hàng mới (tôi cần giá trị của hàng mới). Tôi đã đọc rất nhiều về nó và tìm thấy các giải pháp khác nhau, một là sử dụng SELECT LAST_INSERT_ID(). Tôi đã nghe nhiều điều khác nhau về điều này. Tôi có thể hoặc không thể sử dụng điều này? Tôi lo lắng rằng một kết nối khác có thể chèn một hàng mới trước khi tôi có thể gọi số SELECT LAST_INSERT_ID() và do đó nhận được ID sai.Sử dụng MYSQL LAST_INSERT_ID() để truy xuất ID của hàng được chèn?

Để tổng hợp, có an toàn khi sử dụng SELECT LAST_INSERT_ID() không? Nếu không, làm thế nào tôi có thể lấy id được chèn cuối cùng một cách an toàn?

+0

chèn cuối id nên trả lại id cuối cùng được tạo cho kết nối hiện tại. Không cần phải lo lắng về các kết nối khác. –

+0

Tham khảo: http: //dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id –

+2

Nếu bạn có kết nối tự động tổng hợp, hãy chạy một cuộc gọi khác có thể được thực hiện theo cách khác kết nối. Nếu bạn không có, bạn an toàn. –

Trả lời

12

Tôi không nghĩ rằng bạn cần phải lo lắng về trường hợp bạn đang đề cập ở đây.

Từ tài liệu Mysql:
ID đã được tạo được duy trì trên máy chủ trên cơ sở mỗi kết nối. Điều này có nghĩa là giá trị trả về bởi hàm cho một khách hàng cụ thể là giá trị AUTO_INCREMENT đầu tiên được tạo cho câu lệnh gần đây nhất ảnh hưởng đến cột AUTO_INCREMENT bởi ứng dụng khách đó. Giá trị này không thể bị ảnh hưởng bởi các khách hàng khác, ngay cả khi họ tạo ra các giá trị AUTO_INCREMENT của riêng họ. Hành vi này đảm bảo rằng mỗi khách hàng có thể truy xuất ID riêng của mình mà không cần quan tâm đến hoạt động của các khách hàng khác và không cần khóa hoặc giao dịch.

Đối với thông tin chi tiết, tham khảo this

Mặc dù, tôi rất thích đọc từ những người khác nếu họ có ý kiến ​​khác nhau.

0

Nếu điều quan trọng là bạn có id cuối cùng của bảng, bạn có thể khóa bảng để ghi, sau đó thực hiện SELECT MAX(id) FROM table_name và sau đó mở khóa bảng.

0

ID được tạo trên cơ sở mỗi kết nối nên bạn không nên gặp bất kỳ sự cố nào! This bài đăng chi tiết hơn.

0

Vâng, theo tài liệu chính thức, nó là an toàn:

ID được tạo ra được duy trì trong các máy chủ trên một cơ sở cho mỗi kết nối. Điều này có nghĩa là giá trị trả về bởi hàm cho một máy khách đã cho là giá trị AUTO_INCREMENT đầu tiên được tạo cho câu lệnh gần đây nhất ảnh hưởng đến cột AUTO_INCREMENT bởi máy khách đó. Giá trị này không thể bị ảnh hưởng bởi các máy khách khác, ngay cả khi chúng tạo ra các giá trị AUTO_INCREMENT của riêng chúng. Hành vi này đảm bảo rằng mỗi khách hàng có thể truy xuất ID riêng của mình mà không cần quan tâm đến hoạt động của các khách hàng khác và không cần khóa hoặc giao dịch.

Taken từ: MYSQL Documentation 12.13. Information Functions

0

Nếu bạn đang sử dụng PDO, sử dụng PDO::lastInsertId.

và nếu bạn đang sử dụng mysql, sử dụng mysqli::$insert_id.

và có nó là an toàn để sử dụng AI Đây là bài đăng có nội dung này: http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

và thay vì sử dụng selec t tuyên bố trực tiếp, cố gắng sử dụng preparedStatement.

Ngoài ra bạn có thể sử dụng Lock

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