2015-05-02 24 views
9

Gần đây tôi đã gặp một vấn đề mà tôi cần để có thể lấy ID cuối cùng của truy vấn mà tôi đã chèn vào một trang. Quá trình này khá đơn giản, nhưng tôi muốn một số đảm bảo về quá trình được thực hiện. Dưới đây là cách mã của tôi là:Hiệu quả của Last_insert_id là bao nhiêu?

$query30 = $db->query("INSERT `mybb_quickexample` SET `player1` = '".$row19[username]."', `player2` = '".$row18[username]."', `games` = '".$numberofgames."'")or die(  mysqli_error()); 

Như bạn có thể thấy tôi vừa chèn thứ gì đó vào mybb_quickexample, sau đó tạo ID. Bây giờ trong mã trực tiếp dưới nó, tôi cố gắng tìm ID.

$mmid = $db->insert_id(); 

foreach($_POST['optiontitle'] as $val){ 
$val = $db->escape_string($val); // 
echo $val; 
$query30 = $db->query("INSERT `mybb_quickexample2` SET `gid` = '".$id."', `mid` = '".$mmid."', `optiontitle` = 'OPTION TITLE', `option1` = '$val'")or die(  mysqli_error()); 

} 

Như bạn có thể thấy, nó lấy ID gần đây và đặt nó vào bảng mới. Cho phép 2 bảng này tương ứng với nhau sau này khi tôi cần chúng.

Tuy nhiên, không insert_last_id lấy hàng cuối cùng được chèn vào cơ sở dữ liệu hoặc hàng cuối cùng được chèn vào cơ sở dữ liệu trên trang? Bây giờ tôi không hoàn toàn chắc chắn về cơ chế đằng sau điều này, nhưng tôi hỏi điều này bởi vì, nếu một người tải trang này vào đúng thời điểm chính xác như một người khác thì sao? Sẽ có lấy ID chưa từng có hoặc mã vẫn hoạt động?

+0

Bản sao có thể có của http://kera.name/articles/2011/08/one-less-bug-to-worry-about/ –

+0

@LightnessRacesinOrbit Đó không phải là bài đăng trên stackoverflow. _Có thể trùng lặp_? – rpax

+0

@rpax:: whoosh: –

Trả lời

8

insert_last_id trả về ID được chèn cuối cùng của cùng một phiên SQL/kết nối (xem MySQL manual). - Máy chủ SQL không biết về các trang của bạn. Miễn là kết nối/phiên không được chia sẻ thì không có vấn đề gì (chẳng hạn như điều kiện chủng tộc).

Cũng có thể lấy ID được chèn cuối cùng bằng cách sử dụng SQL: select LAST_INSERT_ID(); hoặc sử dụng trực tiếp trong truy vấn SQL sau để giảm các chuyến đi khứ hồi của máy chủ-khách như insert table B set foreign_id=LAST_INSERT_ID(),data="something"; (lưu ý, nếu câu lệnh SQL sau đây cũng có một cột tự động tăng các LAST_INSERT_ID() cuộc gọi tiếp theo sẽ trở lại mới nhất ID chèn vào, xem MySQL manual)

+0

Thật sao? Tôi chưa bao giờ nghe nói về insert_last_id trước ngày hôm nay – Strawberry

+3

Đó là cách duy nhất (w/o khóa một bảng) để có được ID được chèn mới nhất theo cách an toàn. – MrTux

1

một số thư viện có thể lấy last-insert-id tự động cho dù bạn yêu cầu họ hay không, trong trường hợp đó gọi nó là luôn luôn an toàn (như không có thêm yêu cầu đối với cơ sở dữ liệu).

Trong trường hợp ngược lại, nó trả về id cuối cùng của kết nối. Nếu kết nối được chia sẻ, thì tốt nhất là kết nối nó trong một giao dịch.

6

Những người khác đã chỉ ra rằng LAST_INSERT_ID được duy trì trên mỗi kết nối MySQL. Nó nắm bắt id thực tế được sử dụng trong lần chèn gần đây nhất với giá trị autoincrementing trong kết nối của bạn. Đó là, nó làm điều đúng ngay cả khi các kết nối khác cũng đang làm rất nhiều chèn. (Điều đó có thể đúng trên một trang web bận rộn phục vụ cho nhiều người dùng đồng thời.)

Nếu bạn cần sử dụng nó trong bộ chèn, bạn có thể làm điều đó trực tiếp mà không cần bất kỳ loại chuyến đi khứ hồi nào cho khách hàng. Ví dụ: dưới đây là hai truy vấn bạn có thể phát hành một truy vấn khác với chương trình của bạn

INSERT INTO person (first, last) 
      VALUES ('Jack', 'Straw'); 

INSET INTO address (person_id, addr, town) 
      VALUES (LAST_INSERT_ID(),'10 Downing St', 'London'); 

Xem cách thức hoạt động? Bạn có thể sử dụng nó để cung cấp một giá trị trong danh sách giá trị chèn. Đó là một trong những điều đơn giản và hiệu quả nhất trong MySQL khi bạn sử dụng nó theo cách đó.

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