|
ตัวอย่างการทำ Auto Number แบบมี รหัส/ตัวอักษร/ปี/เดือน (หรืออื่นๆ) ข้างหน้า แบบที่ 2 |
ตัวอย่างการทำ Auto Number แบบมี รหัส/ตัวอักษร/ปี/เดือน (หรืออื่นๆ) ข้างหน้า แบบที่ 2
บทความนี้ได้แรงบันดาลใจจากบทความ ตัวอย่างการทำ Auto Number แบบมี รหัส/ตัวอักษร/ปี/เดือน ข้างหน้า โดยมีการปรับปรุงการสร้าง id ลักษณะนี้ให้เรียบง่ายขึ้น
เรียบง่ายขึ้นอย่างไร ไปดูกัน
ในบทความที่กล่าวถึงก่อนหน้านี้นั้น ใช้วิธีสร้างค่า id ด้วยข้อมูล 3 คอลัมน์
ซึ่งในบางครั้งอาจจะยุ่งยากสำหรับมือใหม่ที่อยากจะปรับเปลี่ยนตารางเดิมของตัวเองให้เป็นแบบนั้น
แต่ในบทความนี้เราจะใช้ข้อมูล id เพียงคอลัมน์เดียว
CREATE TABLE IF NOT EXISTS `auto_id_test` (
`id` char(16) character set ascii NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
และในตัวอย่างนี้ เราจะใช้ SQL ในการตรวจหาค่า id ถัดไปเพียงอย่างเดียว ซึ่งจะทำให้ทำงานได้รวดเร็วมากๆ
การ INSERT id รูปแบบ YYYY-XXXXX (ปีตามด้วยเลขอัตโนมัติ)
INSERT
INTO `auto_id_test`
(`id`)
VALUES (
# ใช้ฟังก์ชั่นนี้เชื่อมต่อสตริงเข้าด้วยกัน
CONCAT(
# ปีของเวลาปัจจุบันตามด้วยขีด เช่น 2013-
DATE_FORMAT(NOW(), '%Y-'),
# ใช้ LPAD() เพื่อเติมตัวอักษรตามที่ต้องการเข้าข้างหน้าตัวเลข (ในที่นี้คือ 0)
LPAD(
IFNULL(
# Sub Query ที่จะเลือก 'ตัวเลขสุดท้าย' ของ id ในปีปัจจุบัน
(SELECT
# ตัดเฉพาะส่วนเลขอัตโนมัติของ id ออกมา
SUBSTR(`id`, 6)
FROM `auto_id_test` AS `alias`
# โดยหาเฉพาะปีปัจจุบัน
WHERE SUBSTR(`id`, 1, 4) = DATE_FORMAT(NOW(), '%Y')
# เรียงตามลำดับ id จากมากไปหาน้อย เพื่อเอาค่าล่าสุดออกมา
ORDER BY `id` DESC
LIMIT 1
)
# และ + ด้วย 1 เสมอ ซึ่งจะทำให้ได้เลขที่เรียงกันไป
+ 1,
# หาก Sub Query ข้างบนคืนแถวกลับมาเป็น NULL ก็ให้ใช้ค่า 1 (เริ่มแถวแรกของปี)
1
),
5, # โดยให้เป็นตัวเลข 5 หลัก
'0' # ตัวอักษรที่จะเติมข้างหน้าตัวเลข
)
)
)
หากต้องการเพิ่มเดือนให้เป็นรูปแบบ YYYY-MM-XXXXX ก็ทำได้โดยเพิ่มรูปแบบเดือนเข้าไปใน DATE_FORMAT()
INSERT
INTO `auto_id_test`
(`id`)
VALUES (
# ใช้ฟังก์ชั่นนี้เชื่อมต่อสตริงเข้าด้วยกัน
CONCAT(
# ปีและเดือนของเวลาปัจจุบันตามด้วยขีด เช่น 2013-03-
DATE_FORMAT(NOW(), '%Y-%m-'),
# ใช้ LPAD() เพื่อเติมตัวอักษรตามที่ต้องการเข้าข้างหน้าตัวเลข (ในที่นี้คือ 0)
LPAD(
IFNULL(
# Sub Query ที่จะเลือก 'ตัวเลขสุดท้าย' ของ id ในปีปัจจุบัน
(SELECT
# จำนวนสูงจุดของ ส่วนหลังเครื่องหมาย - ของ id
MAX(SUBSTR(`id`, 9))
FROM `auto_id_test` AS `alias`
# โดยหาเฉพาะปีและเดือนปัจจุบัน
WHERE SUBSTR(`id`, 1, 7) = DATE_FORMAT(NOW(), '%Y-%m')
# เรียงตามลำดับ id จากมากไปหาน้อย เพื่อเอาค่าล่าสุดออกมา
ORDER BY `id` DESC
LIMIT 1
)
# และ + ด้วย 1 เสมอ ซึ่งจะทำให้ได้เลขที่เรียงกันไป
+ 1,
# หาก Sub Query ข้างบนคืนแถวกลับมาเป็น NULL ก็ให้ใช้ค่า 1 (เริ่มแถวแรกของปี)
1
),
5, # โดยให้เป็นตัวเลข 5 หลัก
'0' # ตัวอักษรที่จะเติมข้างหน้าตัวเลข
)
)
)
หรือแม้แต่ต้องการเพิ่มรหัสอื่นๆ ก็ทำได้เช่นกัน เช่นหากต้องการให้มีรูปแบบ TC-YYYY-MM-XXXXX
INSERT
INTO `auto_id_test`
(`id`)
VALUES (
# ใช้ฟังก์ชั่นนี้เชื่อมต่อสตริงเข้าด้วยกัน
CONCAT(
# ปีและเดือนของเวลาปัจจุบันตามด้วยขีด เช่น 2013-03-
DATE_FORMAT(NOW(), 'TC-%Y-%m-'),
# ใช้ LPAD() เพื่อเติมตัวอักษรตามที่ต้องการเข้าข้างหน้าตัวเลข (ในที่นี้คือ 0)
LPAD(
IFNULL(
# Sub Query ที่จะเลือก 'ตัวเลขสุดท้าย' ของ id ในปีปัจจุบัน
(SELECT
# ตัดเฉพาะส่วนเลขอัตโนมัติของ id ออกมา
SUBSTR(`id`, 12)
FROM `auto_id_test` AS `alias`
# โดยหาเฉพาะปีและเดือนปัจจุบัน
WHERE SUBSTR(`id`, 1, 10) = DATE_FORMAT(NOW(), 'TC-%Y-%m')
# เรียงตามลำดับ id จากมากไปหาน้อย เพื่อเอาค่าล่าสุดออกมา
ORDER BY `id` DESC
LIMIT 1
)
# และ + ด้วย 1 เสมอ ซึ่งจะทำให้ได้เลขที่เรียงกันไป
+ 1,
# หาก Sub Query ข้างบนคืนแถวกลับมาเป็น NULL ก็ให้ใช้ค่า 1 (เริ่มแถวแรกของปี)
1
),
5, # โดยให้เป็นตัวเลข 5 หลัก
'0' # ตัวอักษรที่จะเติมข้างหน้าตัวเลข
)
)
)
ซึ่งสังเกตดูที่ SUBSTR(`id`, ?) และ SUBSTR(`id`, 1, ?)
argument ของ SUBSTR() จะเปลี่ยนไปตามรูปแบบของตัวอักษรที่เพิ่มเข้ามา
หากรูปแบบเป็น YYYY-XXXXX ก็จะเป็น
SUBSTR(`id`, 6) เพราะเริ่มตัดตั้งแต่ตัวอักษรตัวที่ 6
เช่น 2013-00001 เพื่อหาตัวเลขอัตโนมัติ
และ SUBSTR(`id`, 1, 4) เพราะตัดเอาตัวอักษรตัวที่ 1 - 4
เช่น 2013-00001 เพื่อหาเลขปี
หากรูปแบบเป็น YYYY-MM-XXXXX ก็จะเป็น
SUBSTR(`id`, 9) เพราะเริ่มตัดตั้งแต่ตัวอักษรตัวที่ 9
เช่น 2013-03-00001 เพื่อหาตัวเลขอัตโนมัติ
และ SUBSTR(`id`, 1, 4) เพราะตัดเอาตัวอักษรตัวที่ 1 - 7
เช่น 2013-03-00001 เพื่อหาเลขปีและเดือน
|
|
|
|
|
|