INSERT โดยไม่ระบุลำดับคอลัมน์: ต้องส่งค่าครบทุกคอลัมน์ (รวม NULL)
หากไม่ระบุชื่อคอลัมน์ใน INSERT INTO table VALUES(...) ต้องส่งค่าครบทุกคอลัมน์ตามลำดับที่สร้างตาราง ใช้ NULL สำหรับคอลัมน์ที่ไม่มีค่า
สร้างตาราง (4 คอลัมน์)
mysql> CREATE TABLE DemoTable1513 (
-> StudentId INT,
-> StudentName VARCHAR(20),
-> StudentAge INT,
-> StudentCountryName VARCHAR(20)
-> );
Query OK, 0 rows affected (0.58 sec)
INSERT โดยไม่ระบุชื่อคอลัมน์ (ส่งค่า 4 ค่า ทุกครั้ง)
mysql> INSERT INTO DemoTable1513 VALUES(NULL, 'Chris Brown', NULL, NULL); Query OK, 1 row affected (0.11 sec) mysql> INSERT INTO DemoTable1513 VALUES(101, NULL, NULL, NULL); Query OK, 1 row affected (0.10 sec) mysql> INSERT INTO DemoTable1513 VALUES(NULL, NULL, 23, NULL); Query OK, 1 row affected (0.42 sec) mysql> INSERT INTO DemoTable1513 VALUES(NULL, NULL, NULL, 'US'); Query OK, 1 row affected (0.16 sec)
ผลลัพธ์
+-----------+-------------+------------+--------------------+ | StudentId | StudentName | StudentAge | StudentCountryName | +-----------+-------------+------------+--------------------+ | NULL | Chris Brown | NULL | NULL | | 101 | NULL | NULL | NULL | | NULL | NULL | 23 | NULL | | NULL | NULL | NULL | US | +-----------+-------------+------------+--------------------+
✅ แนวทางแนะนำ: ระบุชื่อคอลัมน์เสมอ (Explicit Column List)
-- ดี: ระบุเฉพาะคอลัมน์ที่มีค่า
INSERT INTO DemoTable1513(StudentName) VALUES('Chris Brown');
INSERT INTO DemoTable1513(StudentId) VALUES(101);
INSERT INTO DemoTable1513(StudentAge) VALUES(23);
INSERT INTO DemoTable1513(StudentCountryName) VALUES('US');
-- ผลลัพธ์: คอลัมน์ที่ไม่ระบุจะได้ DEFAULT (หรือ NULL ถ้าไม่มี DEFAULT)
ข้อดีของการระบุชื่อคอลัมน์
- ความชัดเจน: รู้ชัดเจนว่าใส่ค่าอะไรเข้าไปคอลัมน์ไหน
- ความปลอดภัย: ไม่ผิดลำดับเมื่อเพิ่ม/ลบ/ย้ายคอลัมน์ในตาราง
- ความยืดหยุ่น: ใส่เฉพาะคอลัมน์ที่ต้องการ คอลัมน์อื่นใช้ Default/NULL เอง
- ประสิทธิภาพ: MySQL ไม่ต้อง Validate จำนวนค่าเท่ากับจำนวนคอลัมน์ทั้งหมด
⚠️ ข้อควรระวัง
- คอลัมน์
NOT NULLที่ไม่มีDEFAULTต้องระบุค่าทุกครั้ง - คอลัมน์
AUTO_INCREMENTควรเว้นไว้ (หรือส่ง NULL/DEFAULT) TIMESTAMP คอลัมน์แรกที่ไม่มี DEFAULT จะได้ CURRENT_TIMESTAMP อัตโนมัติ
สรุป
ควรระบุชื่อคอลัมน์เสมอ เว้นแต่กรณีพิเศษ (Bulk Load, Migration Script ที่ควบคุมโครงสร้างตารางได้เต็มที่)