mysql auto number

ในโลกของการพัฒนาระบบฐานข้อมูล การกำหนด Primary Key (PK) ที่มีค่าเพิ่มขึ้นอัตโนมัติ (Auto Increment) เป็นสิ่งจำเป็นอย่างยิ่ง เพื่อให้มั่นใจว่าทุกแถวข้อมูลจะมีรหัสประจำตัวที่ไม่ซ้ำกันและสามารถอ้างอิงถึงได้อย่างถูกต้อง

แม้ว่าแนวคิดของ Auto Increment จะเป็นที่รู้จักกันดีในหลายระบบฐานข้อมูล แต่เมื่อเราทำงานกับ PostgreSQL ซึ่งเป็นระบบที่มีความยืดหยุ่นและฟีเจอร์ขั้นสูงกว่า การใช้ไวยากรณ์ที่เหมาะสมจะช่วยให้โค้ดของเรามีความเสถียร ปลอดภัย และมีประสิทธิภาพสูงสุด บทความนี้จะพาคุณไปดูวิธีการสร้าง Auto Increment ID ใน PostgreSQL อย่างถูกต้องตามหลักการของ Senior Architect

🚀 1. วิธีมาตรฐาน: ใช้ GENERATED AS IDENTITY (Best Practice)

สำหรับกรณีส่วนใหญ่ที่ต้องการเพียงแค่รหัส PK ที่เพิ่มขึ้นเรื่อยๆ โดยไม่ต้องกำหนดค่าด้วยตนเอง PostgreSQL แนะนำให้ใช้ไวยากรณ์ GENERATED ALWAYS AS IDENTITY ซึ่งเป็นวิธีที่ทันสมัยและเชื่อถือได้ที่สุดในการสร้างคอลัมน์ Auto Increment

การใช้วิธีนี้จะช่วยให้ฐานข้อมูลจัดการลำดับตัวเลขให้อย่างสมบูรณ์ ทำให้เราไม่ต้องกังวลเรื่องการเขียนโค้ดเพื่อเพิ่มค่าด้วยตนเอง:

ตัวอย่างโค้ด: การสร้างตาราง contents

SQL

CREATE TABLE contents (\n    contentId INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, \n    title VARCHAR(255) NOT NULL,\n    category_id INT\n);

คำอธิบาย: การใช้ GENERATED ALWAYS AS IDENTITY จะทำให้ PostgreSQL รับผิดชอบการเพิ่มค่าของ contentId โดยอัตโนมัติเมื่อมีการแทรกข้อมูล (INSERT) เข้าไปในตาราง ทำให้มั่นใจได้ว่า PK นี้จะไม่ถูกแก้ไขหรือข้ามลำดับโดยผู้ใช้งานภายนอก

✨ 2. การกำหนดลำดับตัวเลขตามเงื่อนไข (Advanced Row Numbering)

บางครั้งความต้องการของเราไม่ได้เป็นเพียงแค่รหัสที่เพิ่มขึ้นเรื่อยๆ แต่เราอาจต้องการให้มีการจัดเรียงและกำหนดหมายเลขลำดับใหม่ โดยเฉพาะเมื่อต้องจัดกลุ่มข้อมูล (Grouping) เช่น ต้องการให้ภายใน Category เดียวกัน มีการนับลำดับ 1, 2, 3…

ในกรณีนี้ เราไม่ควรใช้ Auto Increment ทั่วไป แต่ควรใช้ Window Function ที่ชื่อว่า ROW_NUMBER() ซึ่งเป็นเครื่องมือที่ทรงพลังของ PostgreSQL:

ตัวอย่างโค้ด: การกำหนดลำดับภายในกลุ่ม (Partitioning)

SQL

SELECT \n    title, \n    category_id,\n    ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY title ASC) AS row_num\nFROM contents;

คำอธิบาย: ROW_NUMBER() OVER (...) จะทำการนับลำดับใหม่ โดยมีเงื่อนไขว่าให้เริ่มนับใหม่ทุกครั้งที่ค่าในคอลัมน์ category_id เปลี่ยนไป (PARTITION BY category_id) และการเรียงลำดับภายในกลุ่มจะยึดตามชื่อเรื่อง (ORDER BY title ASC)

💡 สรุปและข้อควรจำสำหรับ Senior Architect

  1. PK มาตรฐาน: สำหรับ PK ทั่วไป ให้ใช้ GENERATED ALWAYS AS IDENTITY เสมอ เพื่อความปลอดภัยและความเสถียรสูงสุด
  2. การจัดลำดับเฉพาะกิจ: หากต้องการหมายเลขที่ขึ้นอยู่กับการเรียงลำดับ (เช่น ลำดับบทความในหมวดหมู่) ให้ใช้ ROW_NUMBER() OVER (...) แทนการพยายามแก้ไขค่า PK โดยตรง

การทำความเข้าใจความแตกต่างระหว่าง Auto Increment ทั่วไปกับ Window Function จะช่วยให้คุณออกแบบระบบฐานข้อมูลที่ซับซ้อนได้อย่างแม่นยำและมีประสิทธิภาพสูงสุดใน PostgreSQL