2010-06-28 35 views
6

Tôi đang cố truy xuất id của một bảng A để chèn vào bảng B. Tôi không thể sử dụng last_insert_id() vì tôi chưa chèn bất kỳ thứ gì vào A. Mọi ý tưởng về cách thực hiện độc đáo?SELECT id cuối cùng, không có INSERT

$n = mysql_query("SELECT max(id) FROM tablename"); dường như không làm việc, cũng không

$n = mysql_query("SELECT max(id) FROM tablename GROUP BY id"); 
+0

Động cơ nào? mysql, mssql? truy cập? – masfenix

+0

Bạn có ý nghĩa gì bởi "dường như không hoạt động"? –

+0

Xác định "dường như không hoạt động". Cái gì không hiệu quả? Nó quay trở lại cái gì? Nó nên là gì? – CaffGeek

Trả lời

15

Trong MySQL, điều này không trả về giá trị cao nhất từ ​​id cột:

SELECT MAX(id) FROM tablename; 

Tuy nhiên, điều này không đưa id vào $n:

$n = mysql_query("SELECT max(id) FROM tablename"); 

Để nhận giá trị, bạn cần phải làm điều này:

$result = mysql_query("SELECT max(id) FROM tablename"); 

if (!$result) { 
    die('Could not query:' . mysql_error()); 
} 

$id = mysql_result($result, 0, 'id'); 

Nếu bạn muốn nhận được ID chèn cuối cùng từ A, và chèn nó vào B, bạn có thể làm điều đó với một lệnh:

INSERT INTO B (col) SELECT MAX(id) FROM A; 
0

Tôi nghĩ thêm dấu thời gian cho mọi bản ghi và nhận được bản ghi mới nhất. Trong tình huống này, bạn có thể nhận được bất kỳ id, gói hàng và ops khác.

0

Bạn có thể get maximum column value and increment it:

InnoDB sử dụng các thuật toán sau đây để khởi tạo tự động tăng truy cập cho một t bảng có chứa một AUTO_INCREMENT cột tên ai_col: Sau một khởi động máy chủ, cho là người đầu tiên chèn vào một bảng t, InnoDB thực hiện tương đương với tuyên bố này:

SELECT MAX(ai_col) FROM t FOR UPDATE; 

InnoDB tăng thêm một giá trị được truy xuất bằng tuyên bố và gán nó vào cột và đến số đếm tự động tăng thêm cho bảng là . Nếu bảng là trống rỗng, InnoDB sử dụng giá trị 1.

Ngoài ra bạn có thể sử dụng và giá trị so SHOW TABLE STATUS "AUTO_INCREMENT" của nó.

+0

Chủ đề an toàn như thế nào? –

+0

"để cập nhật" có nghĩa là bảng bị khóa để ghi cho đến khi lựa chọn kết thúc. Tất nhiên sẽ tốt hơn nếu chọn giá trị tối đa và chèn vào một giao dịch khóa hai bảng này. – silent

+1

Khóa để viết ?! Ouch. –

0

Bạn descendingly có thể ra lệnh cho tabele bởi id và hạn chế số lượng kết quả để một:

SELECT id FROM tablename ORDER BY id DESC LIMIT 1 

NHƯNG:ORDER BY sắp xếp lại toàn bộ bảng cho yêu cầu này. Vì vậy, nếu bạn có rất nhiều dữ liệu và bạn cần lặp lại thao tác này nhiều lần, tôi sẽ không đề xuất giải pháp này.

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