MYSQL – การเปลี่ยนแปลง, DROP, RENAME, MODIFY
⚡ สรุปอย่างชาญฉลาด
ALTER, DROP, RENAME และ MODIFY คือคำสั่งต่างๆ MySQL คำสั่งที่ปรับเปลี่ยนโครงสร้างฐานข้อมูลหลังจากที่ได้ใช้งานไปแล้ว คำสั่งเหล่านี้จะเพิ่ม ลบ เปลี่ยนชื่อ และกำหนดนิยามใหม่ของวัตถุต่างๆ เช่น ตารางและคอลัมน์ โดยไม่ลบแถวที่จัดเก็บไว้แล้ว

คำสั่ง ALTER คืออะไรใน MySQL?
การขอ แก้ไข คำสั่งนี้ใช้สำหรับแก้ไขฐานข้อมูล ตาราง มุมมอง หรือวัตถุฐานข้อมูลอื่นๆ ที่มีอยู่แล้ว ซึ่งจำเป็นต้องเปลี่ยนแปลงในระหว่างวงจรชีวิตของฐานข้อมูล เป็นคำสั่งที่ช่วยให้โครงสร้างฐานข้อมูลพัฒนาไปได้หลังจากที่สร้างและเติมข้อมูลลงไปแล้ว
ความต้องการทางธุรกิจมักไม่หยุดนิ่ง และการออกแบบฐานข้อมูลก็ต้องปรับเปลี่ยนตามไปด้วย สมมติว่าการออกแบบฐานข้อมูล Myflix ได้ถูกนำไปใช้งานแล้ว และผู้ใช้กำลังใช้งานอยู่ แต่แล้วทีมงานก็ตระหนักว่าข้อมูลสำคัญบางส่วนหายไป ไม่มีใครอยากสูญเสียข้อมูลเดิม พวกเขาเพียงต้องการบันทึกข้อมูลใหม่ควบคู่ไปกับข้อมูลเดิมเท่านั้น
คำสั่ง ALTER ครอบคลุมสถานการณ์ดังกล่าวได้อย่างแม่นยำ สามารถเปลี่ยนชนิดข้อมูลของฟิลด์จากสตริงเป็นตัวเลข เปลี่ยนชื่อฟิลด์ หรือเพิ่มคอลัมน์ใหม่ลงในตารางได้ โดยที่ข้อมูลที่จัดเก็บอยู่ในตารางเดิมยังคงอยู่ครบถ้วน
เมื่อกำหนดวัตถุประสงค์ของคำสั่งได้แล้ว ขั้นตอนต่อไปคือการกำหนดไวยากรณ์ที่จะใช้ในการดำเนินการคำสั่งนั้น
MySQL ไวยากรณ์ ALTER
ไวยากรณ์พื้นฐานที่ใช้ในการเพิ่มคอลัมน์ลงในตารางที่มีอยู่แล้วแสดงไว้ด้านล่าง
ALTER TABLE `table_name` ADD COLUMN `column_name` `data_type`;
ที่นี่
- “แก้ไขตาราง `table_name`” เป็นคำสั่งที่บอก MySQL เซิร์ฟเวอร์เพื่อแก้ไขตารางชื่อ `table_name`
- “เพิ่มคอลัมน์ `column_name` `data_type`” เป็นคำสั่งที่บอก MySQL เพิ่มคอลัมน์ใหม่ชื่อ `column_name` และชนิดข้อมูลเป็น `data_type` ลงในเซิร์ฟเวอร์
สมมติว่า Myflix ได้นำระบบการเรียกเก็บเงินและการชำระเงินออนไลน์มาใช้ เพื่อรองรับระบบนี้ จำเป็นต้องเพิ่มช่องสำหรับหมายเลขบัตรเครดิตลงในตารางสมาชิก ก่อนที่จะทำการแก้ไขใดๆ ควรตรวจสอบโครงสร้างของตารางในปัจจุบันก่อน สคริปต์ที่แสดงด้านล่างนี้จะทำเช่นนั้น
SHOW COLUMNS FROM `members`;
| สนาม | ประเภท | โมฆะ | คีย์ | ค่าเริ่มต้น | พิเศษ |
|---|---|---|---|---|---|
| หมายเลขสมาชิก | int (11) | NO | ปรีดี | NULL | อัตโนมัติ_เพิ่ม |
| full_names | วาร์ชาร์(350) | NO | NULL | ||
| เพศ | วาร์ชาร์(6) | YES | NULL | ||
| วันเกิด | ข้อมูล | YES | NULL | ||
| ทางกายภาพ_ที่อยู่ | วาร์ชาร์(255) | YES | NULL | ||
| ที่อยู่ไปรษณีย์ | วาร์ชาร์(255) | YES | NULL | ||
| หมายเลขติดต่อ | วาร์ชาร์(75) | YES | NULL | ||
| อีเมล | วาร์ชาร์(255) | YES | NULL |
💡 หมายเหตุเกี่ยวกับ int(11): ตัวเลขในวงเล็บเป็นเพียงความกว้างในการแสดงผลเท่านั้น MySQL เวอร์ชัน 8.0.17 ได้ยกเลิกการใช้งานสำหรับประเภทข้อมูลจำนวนเต็ม ดังนั้นเซิร์ฟเวอร์รุ่นใหม่จึงรายงานคอลัมน์นี้เป็นเพียง intขนาดพื้นที่จัดเก็บข้อมูลยังคงเท่าเดิม
สคริปต์ด้านล่างนี้จะเพิ่มฟิลด์ใหม่ลงในตารางสมาชิก
ALTER TABLE `members` ADD COLUMN `credit_card_number` VARCHAR(25);
การรันสคริปต์นี้กับ myflixdb จะเพิ่มคอลัมน์ชื่อ credit_card_number ลงในตาราง members โดยใช้ชนิดข้อมูล VARCHAR การรันสคริปต์ SHOW COLUMNS อีกครั้งจะให้ผลลัพธ์ดังต่อไปนี้
| สนาม | ประเภท | โมฆะ | คีย์ | ค่าเริ่มต้น | พิเศษ |
|---|---|---|---|---|---|
| หมายเลขสมาชิก | int (11) | NO | ปรีดี | NULL | อัตโนมัติ_เพิ่ม |
| full_names | วาร์ชาร์(350) | NO | NULL | ||
| เพศ | วาร์ชาร์(6) | YES | NULL | ||
| วันเกิด | ข้อมูล | YES | NULL | ||
| ทางกายภาพ_ที่อยู่ | วาร์ชาร์(255) | YES | NULL | ||
| ที่อยู่ไปรษณีย์ | วาร์ชาร์(255) | YES | NULL | ||
| หมายเลขติดต่อ | วาร์ชาร์(75) | YES | NULL | ||
| อีเมล | วาร์ชาร์(255) | YES | NULL | ||
| หมายเลขบัตรเครดิต | วาร์ชาร์(25) | YES | NULL |
แถวที่ไฮไลต์ไว้เป็นการยืนยันว่าหมายเลขบัตรเครดิตได้ถูกเพิ่มเข้าไปในตารางสมาชิกแล้ว และข้อมูลที่มีอยู่ในคอลัมน์อื่นๆ จะไม่เปลี่ยนแปลงจากการเพิ่มนี้
การเพิ่มคอลัมน์เป็นเพียงครึ่งหนึ่งของเรื่องราวทั้งหมด โครงสร้างข้อมูลยังต้องกำจัดวัตถุที่ไม่จำเป็นอีกต่อไป ซึ่งเป็นหน้าที่ของคำสั่ง DROP
คำสั่ง DROP คืออะไรใน MySQL?
คำสั่ง DROP ใช้สำหรับลบวัตถุอย่างถาวร ใช้เพื่อ...
- ลบฐานข้อมูลออกจาก MySQL เซิร์ฟเวอร์.
- ลบวัตถุ เช่น ตารางหรือคอลัมน์ ออกจากฐานข้อมูล
⚠️คำเตือน: คำสั่ง DROP ไม่สามารถย้อนกลับได้ ทั้งอ็อบเจ็กต์และข้อมูลภายในนั้นไม่สามารถกู้คืนได้หากไม่มีการสำรองข้อมูล ดังนั้นให้เรียกใช้คำสั่ง SELECT กับเป้าหมายและตรวจสอบการสำรองข้อมูลก่อน
หล่นping คอลัมน์
ในตัวอย่างคำสั่ง ALTER ด้านบน มีการเพิ่มคอลัมน์ชื่อ credit_card_number ลงในตาราง members สมมติว่าฟีเจอร์การเรียกเก็บเงินออนไลน์ถูกเลื่อนออกไป และคอลัมน์นั้นควรถูกลบออก สคริปต์ต่อไปนี้จะดำเนินการดังกล่าว
ALTER TABLE `members` DROP COLUMN `credit_card_number`;
การรันสคริปต์จะลบคอลัมน์ credit_card_number ออกจากตาราง members การตรวจสอบรายชื่อคอลัมน์อีกครั้งจะยืนยันผลลัพธ์ที่ได้
SHOW COLUMNS FROM `members`;
| สนาม | ประเภท | โมฆะ | คีย์ | ค่าเริ่มต้น | พิเศษ |
|---|---|---|---|---|---|
| หมายเลขสมาชิก | int (11) | NO | ปรีดี | NULL | อัตโนมัติ_เพิ่ม |
| full_names | วาร์ชาร์(350) | NO | NULL | ||
| เพศ | วาร์ชาร์(6) | YES | NULL | ||
| วันเกิด | ข้อมูล | YES | NULL | ||
| ทางกายภาพ_ที่อยู่ | วาร์ชาร์(255) | YES | NULL | ||
| ที่อยู่ไปรษณีย์ | วาร์ชาร์(255) | YES | NULL | ||
| หมายเลขติดต่อ | วาร์ชาร์(75) | YES | NULL | ||
| อีเมล | วาร์ชาร์(255) | YES | NULL |
หมายเลขบัตรเครดิตหายไปจากรายการช่องข้อมูลแล้ว
วางตาราง
ไวยากรณ์สำหรับการลบตารางทั้งหมดออกจากฐานข้อมูลมีดังนี้
DROP TABLE `sample_table`;
เมื่อนำไปใช้กับวัตถุจริง ประโยคนี้จะมีลักษณะดังนี้
DROP TABLE `categories_archive`;
การเรียกใช้คำสั่งนี้จะลบตารางชื่อ `categories_archive` และทุกแถวในตารางนั้นออกจากฐานข้อมูล
วางฐานข้อมูล
คีย์เวิร์ดเดียวกันนี้สามารถลบสคีมาทั้งหมดได้ การเพิ่ม IF EXISTS จะช่วยระงับข้อผิดพลาดที่เกิดขึ้น MySQL จะเกิดข้อผิดพลาดเมื่อเป้าหมายหายไปแล้ว ซึ่งมีประโยชน์ในสคริปต์ที่ทำงานมากกว่าหนึ่งครั้ง
DROP DATABASE IF EXISTS `myflixdb_backup`;
การลบวัตถุถือเป็นการตัดสินใจขั้นสุดท้าย หากวัตถุนั้นควรคงอยู่ต่อไปและมีเพียงชื่อที่ไม่ถูกต้อง คำสั่ง RENAME คือเครื่องมือที่ถูกต้อง
คำสั่ง RENAME คืออะไรใน MySQL?
คำสั่ง RENAME ใช้สำหรับเปลี่ยนชื่อวัตถุในฐานข้อมูลที่มีอยู่แล้ว เช่น ตารางหรือคอลัมน์ ให้เป็นชื่อใหม่ การเปลี่ยนชื่อตารางไม่ได้ทำให้ข้อมูลใดๆ ที่อยู่ในตารางนั้นสูญหายไป
คำสั่งนี้มีโครงสร้างพื้นฐานดังต่อไปนี้
RENAME TABLE `current_table_name` TO `new_table_name`;
ในการเปลี่ยนชื่อตาราง movierentals เป็น movie_rentals จะใช้สคริปต์ด้านล่างนี้
RENAME TABLE `movierentals` TO `movie_rentals`;
เมื่อรันคำสั่งนี้ จะเปลี่ยนชื่อตาราง `movierentals` เป็น `movie_rentals` เนื่องจากการเปลี่ยนชื่อเป็นการเปลี่ยนแค่ป้ายกำกับเท่านั้น การรันคำสั่งเดียวกันในทางกลับกันจะคืนค่าชื่อเดิมกลับมา
RENAME TABLE `movie_rentals` TO `movierentals`;
คำสั่ง RENAME TABLE ใช้สำหรับจัดการชื่อของตาราง การเปลี่ยนชื่อตาราง คอลัมน์และการเปลี่ยนแปลงสิ่งที่มันบรรจุอยู่ คือการทำงานของคีย์เวิร์ด CHANGE
คำหลัก CHANGE
คำหลัก CHANGE ช่วยให้คุณสามารถ
- เปลี่ยนชื่อคอลัมน์
- เปลี่ยนชนิดข้อมูลของคอลัมน์
- เปลี่ยนข้อจำกัดของคอลัมน์
ลองพิจารณาตัวอย่างนี้ ฟิลด์ full_names ในตาราง members มีชนิดข้อมูลเป็น varchar และมีความกว้าง 350 ดังที่สคริปต์ด้านล่างยืนยัน
SHOW COLUMNS FROM `members`;
| สนาม | ประเภท | โมฆะ | คีย์ | ค่าเริ่มต้น | พิเศษ |
|---|---|---|---|---|---|
| หมายเลขสมาชิก | int (11) | NO | ปรีดี | NULL | อัตโนมัติ_เพิ่ม |
| full_names | วาร์ชาร์(350) | NO | NULL | ||
| เพศ | วาร์ชาร์(6) | YES | NULL | ||
| วันเกิด | ข้อมูล | YES | NULL | ||
| ทางกายภาพ_ที่อยู่ | วาร์ชาร์(255) | YES | NULL | ||
| ที่อยู่ไปรษณีย์ | วาร์ชาร์(255) | YES | NULL | ||
| หมายเลขติดต่อ | วาร์ชาร์(75) | YES | NULL | ||
| อีเมล | วาร์ชาร์(255) | YES | NULL |
สมมติว่าข้อกำหนดคือ
- เปลี่ยนชื่อฟิลด์จาก “full_names” เป็น “fullname”
- เปลี่ยนเป็นชนิดข้อมูล char โดยกำหนดความกว้างเป็น 250
- เพิ่มข้อจำกัด NOT NULL
การแก้ไขทั้งสามอย่างนี้ดำเนินการโดยใช้คำสั่ง CHANGE เพียงคำสั่งเดียว
ALTER TABLE `members` CHANGE COLUMN `full_names` `fullname` char(250) NOT NULL;
เมื่อรันคำสั่งนี้กับ myflixdb แล้วเรียกใช้สคริปต์ SHOW COLUMNS จะได้ผลลัพธ์ดังต่อไปนี้
| สนาม | ประเภท | โมฆะ | คีย์ | ค่าเริ่มต้น | พิเศษ |
|---|---|---|---|---|---|
| หมายเลขสมาชิก | int (11) | NO | ปรีดี | NULL | อัตโนมัติ_เพิ่ม |
| ชื่อเต็ม | ถ่าน (250) | NO | NULL | ||
| เพศ | วาร์ชาร์(6) | YES | NULL | ||
| วันเกิด | ข้อมูล | YES | NULL | ||
| ทางกายภาพ_ที่อยู่ | วาร์ชาร์(255) | YES | NULL | ||
| ที่อยู่ไปรษณีย์ | วาร์ชาร์(255) | YES | NULL | ||
| หมายเลขติดต่อ | วาร์ชาร์(75) | YES | NULL | ||
| อีเมล | วาร์ชาร์(255) | YES | NULL |
ขณะนี้คอลัมน์มีชื่อว่า fullname เก็บค่า char(250) และไม่ยอมรับค่า NULL
แก้ไขคำหลัก
คำหลัก MODIFY ช่วยให้คุณสามารถ
- แก้ไขชนิดข้อมูลของคอลัมน์
- แก้ไขข้อจำกัดของคอลัมน์
ในตัวอย่าง CHANGE ข้างต้น ต้องระบุชื่อฟิลด์สองครั้ง แม้ว่าการเปลี่ยนชื่อจะเป็นเพียงส่วนหนึ่งของเป้าหมายก็ตาม การไม่ระบุชื่อฟิลด์ในคำสั่ง CHANGE จะทำให้เกิดข้อผิดพลาด เมื่อต้องการปรับเปลี่ยนเฉพาะชนิดข้อมูลและข้อจำกัดเท่านั้น โดยที่ชื่อคอลัมน์ยังคงเหมือนเดิม คำสั่ง MODIFY ก็สามารถทำงานได้โดยระบุชื่อคอลัมน์เพียงครั้งเดียว
สคริปต์ด้านล่างนี้จะเปลี่ยนความกว้างของช่อง "fullname" จาก 250 เป็น 50
ALTER TABLE `members` MODIFY `fullname` char(50) NOT NULL;
เมื่อรันคำสั่งนี้กับ myflixdb แล้วเรียกใช้สคริปต์ SHOW COLUMNS จะได้ผลลัพธ์ดังที่แสดงด้านล่าง
| สนาม | ประเภท | โมฆะ | คีย์ | ค่าเริ่มต้น | พิเศษ |
|---|---|---|---|---|---|
| หมายเลขสมาชิก | int (11) | NO | ปรีดี | NULL | อัตโนมัติ_เพิ่ม |
| ชื่อเต็ม | ถ่าน (50) | NO | NULL | ||
| เพศ | วาร์ชาร์(6) | YES | NULL | ||
| วันเกิด | ข้อมูล | YES | NULL | ||
| ทางกายภาพ_ที่อยู่ | วาร์ชาร์(255) | YES | NULL | ||
| ที่อยู่ไปรษณีย์ | วาร์ชาร์(255) | YES | NULL | ||
| หมายเลขติดต่อ | วาร์ชาร์(75) | YES | NULL | ||
| อีเมล | วาร์ชาร์(255) | YES | NULL |
⚠️คำเตือน: การจำกัดขนาดคอลัมน์จะตัดข้อมูลที่เกินขนาดออกไป ชื่อใดๆ ที่ยาวเกิน 50 ตัวอักษรจะถูกตัดให้สั้นลงด้วยคำสั่งนี้ ดังนั้นควรตรวจสอบค่าที่ยาวที่สุดที่มีอยู่ก่อนแล้ว SELECT สอบถามข้อมูลก่อนทำการลดขนาดฟิลด์
เปลี่ยน เทียบกับ แก้ไข เทียบกับ เปลี่ยนชื่อคอลัมน์
คำหลักทั้งสามคำมีความซ้ำซ้อนกัน และการเลือกใช้คำที่ไม่ถูกต้องเป็นสาเหตุที่พบบ่อยที่สุดของข้อผิดพลาดในส่วนนี้ ตารางด้านล่างแสดงคำหลักทั้งสามคำไว้เคียงข้างกัน
| คำหลัก | เปลี่ยนชื่อคอลัมน์ | เปลี่ยนแปลงประเภทและข้อจำกัด | ต้องระบุชื่อเดิม | การใช้งานทั่วไป |
|---|---|---|---|---|
| เปลี่ยน | มี (ใบกำกับภาษีเต็มรูปแบบ) | มี (ใบกำกับภาษีเต็มรูปแบบ) | ใช่แล้ว รวมถึงชื่อใหม่ด้วย | เปลี่ยนชื่อและกำหนดความหมายใหม่ในคำสั่งเดียว |
| แก้ไข | ไม่ | มี (ใบกำกับภาษีเต็มรูปแบบ) | ชื่อที่ตั้งให้ครั้งเดียว | ขยาย ลดขนาด หรือพิมพ์คอลัมน์ใหม่ |
| เปลี่ยนชื่อคอลัมน์ | มี (ใบกำกับภาษีเต็มรูปแบบ) | ไม่ | ใช่แล้ว รวมถึงชื่อใหม่ด้วย | เปลี่ยนชื่ออย่างเดียว จาก MySQL 8.0 เป็นต้นไป |
MySQL เวอร์ชัน 8.0 เพิ่มตัวเลือกที่สี่สำหรับกรณีที่ง่ายที่สุด นั่นคือการเปลี่ยนชื่อโดยไม่ต้องกำหนดนิยามใหม่เลย
ALTER TABLE `members` RENAME COLUMN `fullname` TO `full_name`;
ประเภทและชื่อได้รับการกำหนดแล้ว คำถามที่เหลือคือคอลัมน์ใหม่จะอยู่ที่ใดในตาราง ซึ่งคำหลัก AFTER จะเป็นตัวควบคุม
คำหลัก AFTER
โดยปกติแล้ว คอลัมน์ที่เพิ่มด้วยคำสั่ง ALTER TABLE จะไปอยู่ที่ท้ายตาราง หากต้องการวางไว้ที่ตำแหน่งเฉพาะเจาะจง จะต้องใช้คำสั่ง ALTER ร่วมกับคำว่า AFTER
สคริปต์ด้านล่างนี้จะเพิ่ม "date_of_registration" ต่อท้าย "date_of_birth" ในตารางสมาชิกโดยตรง
ALTER TABLE `members` ADD `date_of_registration` date NULL AFTER `date_of_birth`;
เมื่อรันคำสั่งนี้กับ myflixdb แล้วเรียกใช้สคริปต์ SHOW COLUMNS จะได้ผลลัพธ์ดังที่แสดงด้านล่าง
| สนาม | ประเภท | โมฆะ | คีย์ | ค่าเริ่มต้น | พิเศษ |
|---|---|---|---|---|---|
| หมายเลขสมาชิก | int (11) | NO | ปรีดี | NULL | อัตโนมัติ_เพิ่ม |
| ชื่อเต็ม | ถ่าน (50) | NO | NULL | ||
| เพศ | วาร์ชาร์(6) | YES | NULL | ||
| วันเกิด | ข้อมูล | YES | NULL | ||
| วันที่ลงทะเบียน | ข้อมูล | YES | NULL | ||
| ทางกายภาพ_ที่อยู่ | วาร์ชาร์(255) | YES | NULL | ||
| ที่อยู่ไปรษณีย์ | วาร์ชาร์(255) | YES | NULL | ||
| หมายเลขติดต่อ | วาร์ชาร์(75) | YES | NULL | ||
| อีเมล | วาร์ชาร์(255) | YES | NULL |
แถวที่ไฮไลต์คือคอลัมน์ที่เพิ่มเข้ามาหลังจากวันเดือนปีเกิด คำหลัก FIRST ทำงานในลักษณะเดียวกันและจะย้ายคอลัมน์ใหม่ไปอยู่ด้านหน้าสุดของตาราง
