Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

เกิดอะไรขึ้นเมื่อ INSERT ค่าว่างในคอลัมน์ TIMESTAMP DEFAULT CURRENT_TIMESTAMP

พฤติกรรมของ 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