2012-01-05 39 views
14

Tôi biết LAST_INSERT_ID() hoạt động như thế nào cho các cột tăng tự động, nhưng tôi không thể tìm cách để lấy id cuối cùng mà tôi đã chèn vào cho cột tăng tự động.Có cách nào để lấy id được chèn cuối cùng của cột KHÔNG tăng tự động trong MySQL không?

Có cách nào tôi có thể làm điều đó không?

+4

Nếu ID không phải là auto-increment, sau đó bạn phải cung cấp cho nó trong câu lệnh INSERT của bạn, vì vậy bạn đã có nó –

+0

@Darhazer: ... khả năng trong ứng dụng khác, có khả năng trên máy khác, có khả năng về một mạng khác ở một quốc gia khác ....? –

+2

bằng cách LAST_INSERT_ID() chỉ hoạt động cho phiên đã chèn bản ghi, nó sẽ không trả lại bất kỳ thứ gì từ mạng khác ở quốc gia khác :) –

Trả lời

12

bạn có thể dễ dàng thực hiện việc đó bằng cách sử dụng cùng một LAST_INSERT_ID().

INSERT INTO thetable (id, value) 
VALUES (LAST_INSERT_ID(126), 'some data'); 

SELECT LAST_INSERT_ID(); -- returns 126 
+0

Thu hoạch đã cho tôi mảnh kiến ​​thức vô giá này ... Phải nói rằng ngay cả một chuỗi chọn có thể được sử dụng thay vì 126 có =) – Manatax

+0

Đây có phải là liên tục qua kết nối? – Manatax

+1

@manatax, giá trị của nó có sẵn trong kết nối cho đến khi bạn chèn hàng mới hoặc cập nhật giá trị như trên – newtover

0

số

Không có thứ tự vốn có của các mối quan hệ, không có "bản ghi được chèn vào lần cuối". Đây là lý do tại sao các trường AUTO_INCREMENT tồn tại, sau khi tất cả.

Bạn phải tự tìm kiếm nhật ký hoặc tự lưu trữ giá trị trong ứng dụng của mình.

0

Không có cách nào với mysql. Nhưng bạn có thể làm điều đó theo chương trình. Không có cột ID gia tăng tự động thì không có cách nào để cơ sở dữ liệu biết được bản ghi nào được chèn vào cuối cùng.

Một cách để làm là sử dụng như cột có chứa dấu thời gian hoặc giá trị ngày giờ. và lấy id giá trị mới nhất của tmestamp để lấy bản ghi được chèn vào cuối cùng

2

Tôi giả sử bạn muốn truy xuất id được chèn cuối cùng này vào một thời điểm sau đó sau khi chèn nó, vì nếu bạn cần nó ngay sau khi chèn nó, bạn rõ ràng đã biết id là gì.

Cách duy nhất bạn có thể nhận được đó là có cột khác trên bảng có thể cho biết hàng nào được chèn lần cuối, chẳng hạn như cột dấu thời gian hoặc cột ngày giờ. Nếu id của bạn là duy nhất và tăng, bạn chỉ có thể sử dụng cột đó. Sau đó, bạn chỉ cần chọn 1 hàng được sắp xếp theo cột đó theo thứ tự giảm dần.

Ví dụ

INSERT INTO my_table (id, timestamp) VALUES (123, NOW()) 

SELECT id FROM my_table ORDER BY timestamp DESC LIMIT 1 

Edit: theo ý kiến ​​dưới đây, bạn tốt hơn bằng cách sử dụng một cột AUTO_INCREMENT, mặc dù cột này không phải là cột id, bạn có thể thêm một ô tô -increment insert_order cột thuộc loại Int và đơn giản là sắp xếp theo thứ tự đó.

+1

Hoạt động tốt đối với _very_ các ứng dụng quy mô nhỏ với việc đảm bảo <= 1 lần chèn mỗi giây. Tất cả những gì bạn đang làm ở đây là phát minh lại 'AUTO_INCREMENT', nhưng theo một cách kém hơn! –

+2

Lưu ý rằng cột tăng tự động là an toàn chỉ. Dấu thời gian không phải là. –

+1

Bạn hoàn toàn đúng, tôi sắp chỉnh sửa bài đăng của mình để giải thích rằng việc sử dụng cột AUTO_INCREMENT tốt hơn, ngay cả khi cột này không giống với id. –

1

Tôi giả định rằng bạn cần ID để tìm hàng vừa được chèn, thay vì tìm hàng được chèn cuối cùng. Trong một ứng dụng web, bạn không bao giờ có thể chắc chắn rằng hàng được chèn cuối cùng là hàng bạn vừa tạo.

Bạn có thể sử dụng GUID làm id trong trường hợp này. GUID thường được lưu trữ dưới dạng chuỗi có độ dài 36 hoặc dưới dạng blob 16byte. GUID có thể được tạo trước khi chèn hàng, và sau đó có thể được lưu trữ trong khi chèn hàng.

Vì id không được tự động tăng lên như bạn đã nêu, bạn phải tạo nó trước khi chèn hàng. Cách an toàn nhất để thực hiện việc này là tạo GUID cần đủ độc đáo. Nếu không, bạn sẽ phải xác định ID không sử dụng cuối cùng, điều gì có thể phức tạp và nguy hiểm.

+0

Trong hầu hết các trường hợp, đây là giải pháp thích hợp. tức là tạo ra mã định danh của riêng bạn và cung cấp nó cho câu lệnh 'INSERT' – SaidbakR

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