ปัญหา
ลำดับ Keyword ใน Column Definition ผิดทำให้เกิด Syntax Error:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ZEROFILL AUTO_INCREMENT PRIMARY KEY' at line 3
สาเหตุ
ลำดับ Keyword ที่ถูกต้องใน MySQL:
column_name DATA_TYPE [(M)] [ZEROFILL] [NOT NULL] [AUTO_INCREMENT] [PRIMARY KEY]
ZEROFILL ต้องอยู่ก่อน NOT NULL และ AUTO_INCREMENT
ตัวอย่างผิด vs ถูก
❌ ผิด (ลำดับผิด)
CREATE TABLE DemoTable (
StudentCode INT(10) NOT NULL ZEROFILL AUTO_INCREMENT PRIMARY KEY
);
✅ ถูก (ลำดับถูกต้อง)
CREATE TABLE DemoTable (
StudentCode INT(10) ZEROFILL NOT NULL AUTO_INCREMENT PRIMARY KEY
);
ตัวอย่างการใช้งานที่ถูกต้อง
1. สร้างตาราง
mysql> CREATE TABLE DemoTable (
-> StudentCode INT(10) ZEROFILL NOT NULL AUTO_INCREMENT PRIMARY KEY
-> );
Query OK, 0 rows affected (0.55 sec)
2. เพิ่มข้อมูล (ไม่ต้องระบุค่า)
mysql> INSERT INTO DemoTable VALUES(); Query OK, 1 row affected (0.21 sec) mysql> INSERT INTO DemoTable VALUES(); Query OK, 1 row affected (0.11 sec) mysql> INSERT INTO DemoTable VALUES(); Query OK, 1 row affected (0.28 sec) mysql> INSERT INTO DemoTable VALUES(); Query OK, 1 row affected (0.10 sec) mysql> INSERT INTO DemoTable VALUES(); Query OK, 1 row affected (0.10 sec)
3. ผลลัพธ์ (Zero-padded)
mysql> SELECT * FROM DemoTable;
ผลลัพธ์:
+-------------+ | StudentCode | +-------------+ | 0000000001 | | 0000000002 | | 0000000003 | | 0000000004 | | 0000000005 | +-------------+ 5 rows in set (0.00 sec)
รายละเอียด ZEROFILL
- เติม 0 นำหน้า (Left-pad) จนครบ Display Width (M ใน INT(M))
- ทำให้ Column กลายเป็น UNSIGNED อัตโนมัติ
- Display Width (M) ไม่จำกัด Range ของข้อมูล (INT ยังคงเป็น -2147483648 ถึง 2147483647)
- MySQL 8.0.17+ แจ้งเตือน Deprecated สำหรับ Display Width (แต่ ZEROFILL ยังทำงาน)
ลำดับ Keyword มาตรฐาน MySQL
column_name
data_type [(length)]
[CHARACTER SET charset_name] [COLLATE collation_name]
[NULL | NOT NULL]
[DEFAULT default_value]
[VISIBLE | INVISIBLE] -- MySQL 8.0+
[AUTO_INCREMENT]
[UNIQUE [KEY] | [PRIMARY] KEY]
[COMMENT 'string']
[COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}]
[STORAGE {DISK|MEMORY}]
[REFERENCES ...]
Best Practice
- หลีกเลี่ยง ZEROFILL ใน Application ใหม่ (Deprecated)
- จัดการ Padding ด้วย Application Code หรือ LPAD() ใน Query แทน
- ใช้ INT UNSIGNED หากไม่ต้องการค่าลบ
- ระบุ Column Name และ Constraint ชัดเจน