Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

แก้ไข ERROR 1064: ZEROFILL ต้องอยู่ก่อน AUTO_INCREMENT ใน MySQL


ปัญหา

ลำดับ 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 ชัดเจน