|  | 
 
   
    |  
        ตัวอย่างการทำ 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 เพื่อหาเลขปีและเดือน
 
 
  
 
 
 
                           
                             |  |  |  |  
                             |  |  |  |