ปัญหา: Reserved Keywords
MySQL มีคำสงวน (Reserved Words) ที่ใช้เป็นคำสั่ง SQL หากใช้เป็นชื่อตาราง/คอลัมน์จะเกิด Syntax Error:
กรณีที่ 1: ชื่อตารางเป็น Reserved Word
CREATE TABLE insert (Id INT);
-- ERROR 1064 (42000): syntax error near 'insert ( Id int )'
กรณีที่ 2: ชื่อคอลัมน์เป็น Reserved Word
CREATE TABLE Customers (Add INT);
-- ERROR 1064 (42000): syntax error near 'Add int )'
วิธีแก้: ใช้ Backtick (`)
ห่อชื่อ Identifier ด้วย Backtick (`) เพื่อบอก MySQL ว่าเป็น Identifier ไม่ใช่ Keyword:
CREATE TABLE `insert` (`Add` INT);
-- สำเร็จ!
Reserved Words ตัวอย่างที่พบบ่อย
| คำสงวน | ประเภท |
|---|---|
| SELECT, INSERT, UPDATE, DELETE | DML Commands |
| CREATE, DROP, ALTER, TRUNCATE | DDL Commands |
| WHERE, FROM, JOIN, GROUP, ORDER, BY | Clauses |
| INDEX, KEY, PRIMARY, UNIQUE, FOREIGN | Constraints |
| INT, VARCHAR, DATE, TIMESTAMP | Data Types |
| USER, GROUP, ORDER, TABLE, DATABASE | Objects |
| ADD, DROP, CHANGE, MODIFY, RENAME | ALTER Actions |
| DESC, ASC, LIMIT, OFFSET | Query Modifiers |
| AND, OR, NOT, LIKE, IN, BETWEEN | Operators |
| NULL, TRUE, FALSE, DEFAULT | Literals |
| CURRENT_TIMESTAMP, NOW, CURDATE | Functions |
ดูรายการ Reserved Words ครบถ้วน
MySQL Official Documentation: https://dev.mysql.com/doc/refman/8.0/en/keywords.html
Best Practices
- หลีกเลี่ยง ใช้ Reserved Words เป็น Identifier
- Prefix/Suffix: ใช้
user_table,order_date,group_id - Backtick ทุกที่: เขียน Query ให้มี Backtick ครอบ Identifier เสมอ
SELECT `id` FROM `table` WHERE `name` = 'x' - Naming Convention: snake_case, คำนามบ่งบอกความหมาย (ไม่ใช่คำสั่ง)
ตัวอย่างที่ถูกต้อง
CREATE TABLE `order` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`user_id` INT,
`order_date` DATETIME DEFAULT CURRENT_TIMESTAMP,
`status` VARCHAR(20) DEFAULT 'pending',
`key` VARCHAR(50), -- key เป็น reserved
`index` INT, -- index เป็น reserved
`group` VARCHAR(100) -- group เป็น reserved
);
สรุป: ใช้ Backtick (`) ครอบชื่อตาราง/คอลัมน์เสมอ จะป้องกัน Error จาก Reserved Words ได้หมด