StepCoding

การใช้คำสงวนเพื่อกำหนดชื่อต่าง ๆ

อ่าน [806] หมวดหมู่: คำสั่ง SQL เบื้องต้น

คำสงวนคือคำที่เป็น keyword ของ MySQL เช่น ชื่อฟังก์ชัน จะไม่สามารถกำหนดเป็นชื่อ table หรือชื่อ field ได้ และจะเกิด error ขึ้นถ้าเรากำหนดให้มัน ผมจะยกตัวอย่างคำสั่งนี้ให้ดูนะครับ ซึ่งมันจะเกิด error เนื่องจากว่าเป็นการกำหนดชื่อ field เป็น "order" ซึ่งเป็นคำสงวนใน MySQL (เป็นคำสงวนที่ใช้ในส่วนของ ORDER BY)

CREATE TABLE t 
(
order INT NOT NULL UNIQUE,
d DATE NOT NULL
);

# ผลลัพธ์
ERROR 1064: 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 'order INT NOT NULL UNIQUE, d Date
NOT NULL)' at line 1

คำสั่งต่อไปนี้ก็จะ error เช่นกัน เนื่องจากเรากำหนดชื่อ alias ให้กับ column เป็นคำสงวน

SELECT 1 AS INTEGER;

# ผลลัพธ์
ERROR 1064: 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 'INTEGER' at line 1

เราสามารถแก้ปัญหาเหล่านี้ได้ (ในกรณีที่ต้องการใช้คำสงวนในการกำหนดชื่อต่าง ๆ) เราจะต้องใส่ quote ให้กับมัน โดยขึ้นอยู่กับชนิดของชื่อต่าง ๆ นั้นเช่น

ถ้าใช้คำสงวนเป็นชื่อ database, table, field หรือ index จะมีวิธีการ quote อยู่ 2 แบบ ขึ้นอยู่กับ mode ที่ server กำลังทำงานอยู่ โดย default การ quote คำสงวนภายใน backtick(`) จะอนุญาติให้เรากำหนดชื่อเป็นคำสงวนได้

CREATE TABLE t 
(
`order` INT NOT NULL UNIQUE,
d DATE NOT NULL
);

# ผลลัพธ์
Query OK, 0 rows affected (0.00 sec)

ถ้า server ถูก start ด้วย --ansi หรือ --sql-mode=ANSI_QUOTES มันจะอนุญาติให้เรา quote โดยการใช้ double quote ได้

CREATE TABLE t
(
"order" INT NOT NULL UNIQUE,
d DATE NOT NULL
);

# ผลลัพธ์
Query OK, 0 rows affected (0.00 sec)

การใช้คำสงวนเป็นชื่อ alias นั้น เราสามารถ quote ได้ทั้งแบบ single quotes และ double quotes หรือ backticks ก็ได้ เช่นต้องการกำหนด alias เป็น INTEGER เราสามารถเขียนได้ดังนี้

# แบบ single quote
SELECT 1 AS 'INTEGER';
# แบบ double quote
SELECT 1 AS "INTEGER";
# แบบ backtick
SELECT 1 AS `INTEGER`;

ผู้สนับสนุน