การอ่านค่า id ล่าสุดจากฐานข้อมูล

เราสามารถอ่านค่า id ล่าสุดจากฐานข้อมูล ได้หลายวิธี ซึ่งแต่ละวิธีก็มีข้อจำกัดแตกต่างกันเล็กน้อยครับ เรามาดูกันว่ามีวิธีใดบ้าง

1.ใช้ฟังก์ชั่น mysql_insert_id() ของ PHP ซี่งฟังก์ชั่นนี้จะคืนค่า id ล่าสุด ที่ทำการ บันทึก หรือ แก้ไข ย้ำว่า บันทึก หรือ แก้ไขนะครับ ถึงจะสามารถคืนค่าออกมาได้ถูกต้อง ฟังก์ชั่นนี้มีข้อเสียเล็กน้อย ตรงที่ เราจะต้องทำการอ่านค่านี้ทันที หลังจากทำการ insert หรือ update เพื่อป้องกันการอัปเดทค่าจากคนอื่น ซึ่งจะทำให้ ค่าที่ได้ไม่ถูกต้อง
 
<?php
     $sql = "INSERT INTO table_name ....."; // query
     $res = mysql_query($sql); // ทำคำสั่ง INSERT
     $last_id = mysql_insert_id(); // คืนค่า id ที่ insert ล่าสุด
 ?>

2.ใช้คำสั่ง SQL โดยการหาค่า max ของ id เช่น SELECT MAX(id) FROM table_name ซึ่งจะได้ id ที่มีค่ามากสุด(หรือ ล่าสุด)ออกมา วิธีนี้ จะใช้เมื่อใดก็ได้ครับ อาจใช้ในการหาค่า id ถัดมาที่จะ insert ได้ โดยการบวก 1 กับค่าที่อ่านได้ ซึ่งวิธีนี้ จะมีข้อเสียที่ หากมีการลบรายการ id ล่าสุดจากฐานข้อมูลออกไปจะทำให้การคืนค่า id ถัดไปที่จะ insert ไม่ภูกต้อง
<?php
      $last_id = "SELECT MAX(id) AS maxid FROM table_name"; // query อ่านค่า id สูงสุด
      $res = mysql_query($sql); // ทำคำสั่ง
      $ret = mysql_fetch_assoc($result); // อ่านค่า
      $last_id = $ret['maxid']; // คืนค่า id ที่ insert สูงสุด
 ?>

ยกตัวอย่าง หากมีการลบ id ที่ 30 ออก (ข้อมูลคือ id ที่ 1,2,3....29,30) จะทำให้ id สูงสุดกลายเป็น 29 ซึ่งหากอ่าน ค่าด้วย MAX ออกมา จะได้ค่านี้ซึ่งเป็นค่าสูงสุด และ id ถัดไปที่จะทำการ inset เป็น 30 แต่ในความเป็นจริง MySQL จะทำการ insert ข้อมูลถัดไปที่ id = 31 (ตามค่าที่อ่านได้จาก AUTO_INCREMENT เนื่องจาก id 30 ถูกบันทึกแล้ว และลบออกไป) ซึ่งไม่ถูกต้องตามความเป็นจริง

การแก้ไขสำหรับกรณีนี้ คือ เราอาจจะกำหนดฟิลด์ id ไม่ให้มันเป็น AUTO_INCREMENT ซึ่งจะทำให้ค่านี้ไม่ถูกเพิ่มโดยอัตโนมัติ ซึ่งเราจะต้องทำการกำหนดค่าฟิลด์นี้เอง

3.อ่านข้อมูล AUTO_INCREMENT จากฐานข้อมูลโดยตรง 
<?php
     $sql = "SHOW TABLE STATUS LIKE 'table_name";
     $result = @mysql_query($sql);
     $row = @mysql_fetch_assoc($result);
     $next_id = (int)$row['Auto_increment']; // คืนค่า id จากค่า AUTO_INCREMENT ของฐานข้อมูล
 ?>

วิธีที่ 1 เหมาะกับการหาค่า id หลังจาก insert หรือ edit เท่านั้นครับ
วิธีที่ 2 เหมาะกับการใช้งานฐานข้อมูลแบบที่ไม่กำหนด AUTO_INCREMENT ซึ่งจะทำให้เราต้องกำหนด id เองครับ
วิธีที่ 3 เหมาะกับการหาค่า id ที่จะบันทึกถัดไป เมื่อมีการกำหนด AUTO_INCREMENT ไว้

ทั้ง 3 วิธี เมื่ออ่านค่าแล้ว ควรมีการใช้ค่านั้นทันที หรือ ทำการ lock ตารางเพื่อป้องกันการ insert ข้อมูลจากผู้อื่นซึ่งจะทำให้ค่าที่อ่านได้ถูกใช้ไปก่อนแล้ว และที่สำคัญ ฟิลด์ id ที่ใช้อ่านต้องกำหนดให้เป็น key ด้วยครับ(ป้องกันการมีค่าซ้ำกัน)
ผู้เขียน goragod โพสต์เมื่อ 23 ส.ค. 2553 เปิดดู 49,876 ป้ายกำกับ PHPMySQL
^