พฤติกรรมของ TIMESTAMP DEFAULT CURRENT_TIMESTAMP
เมื่อกำหนดคอลัมน์เป็น TIMESTAMP DEFAULT CURRENT_TIMESTAMP หาก Insert แถวใหม่ โดยไม่ระบุค่า ให้คอลัมน์นั้น MySQL จะใส่ วันเวลาปัจจุบัน (Current Timestamp) ให้อัตโนมัติ
ตัวอย่างการทดสอบ
1. สร้างตาราง
CREATE TABLE DemoTable (
ArrivalDate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2. Insert 2 แบบ
-- แบบ 1: ระบุค่า NOW() เอง
INSERT INTO DemoTable VALUES (NOW());
-- แบบ 2: ไม่ระบุค่า (ว่าง) - ให้ Default ทำงาน
INSERT INTO DemoTable VALUES ();
3. ผลลัพธ์
SELECT * FROM DemoTable;
+---------------------+
| ArrivalDate |
+---------------------+
| 2019-09-01 14:08:47 | -- จาก NOW()
| 2019-09-01 14:08:50 | -- จาก DEFAULT CURRENT_TIMESTAMP
+---------------------+
รายละเอียดเพิ่มเติม
DEFAULT CURRENT_TIMESTAMP vs ON UPDATE CURRENT_TIMESTAMP
| คำสั่ง | พฤติกรรม |
|---|---|
| DEFAULT CURRENT_TIMESTAMP | ตั้งค่าเมื่อ INSERT (สร้างแถวใหม่) |
| ON UPDATE CURRENT_TIMESTAMP | อัปเดตค่าเมื่อ UPDATE แถว |
| DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | ทั้งสร้างและอัปเดตอัตโนมัติ |
ตัวอย่างครบทั้งสอง
CREATE TABLE DemoTable2 (
CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UpdatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
INSERT INTO DemoTable2 VALUES (); -- CreatedAt และ UpdatedAt = ตอนนี้
UPDATE DemoTable2 SET CreatedAt = CreatedAt WHERE 1; -- UpdatedAt อัปเดตใหม่, CreatedAt คงเดิม
ข้อควรระวัง
TIMESTAMPมีช่วงปี 1970-2038 (Year 2038 Problem) ใช้DATETIMEสำหรับช่วงกว้างกว่า- Time Zone:
TIMESTAMPแปลงเป็น UTC ตอนเก็บ และแปลงกลับ ตอนอ่าน (ขึ้นกับ session time_zone) - MySQL 5.6.5+ รองรับ
DATETIME DEFAULT CURRENT_TIMESTAMPเช่นกัน - คอลัมน์ TIMESTAMP แรกในตารางจะมี DEFAULT CURRENT_TIMESTAMP และ ON UPDATE CURRENT_TIMESTAMP อัตโนมัติ (ถ้าไม่ระบุ) - แนะนำระบุชัดเจน
สรุป
Insert ค่าว่างในคอลัมน์ TIMESTAMP DEFAULT CURRENT_TIMESTAMP → MySQL ใส่วันเวลาปัจจุบันให้อัตโนมัติ เหมาะสำหรับฟิลด์ created_at, updated_at