Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Triển khai DEFAULT CURRENT_TIMESTAMP và ON UPDATE CURRENT_TIMESTAMP trong MySQL

Tự động đặt và cập nhật Timestamp trong MySQL

Sử dụng DEFAULT CURRENT_TIMESTAMP và ON UPDATE CURRENT_TIMESTAMP trên cột TIMESTAMP (hoặc DATETIME MySQL 5.6+) để tự động ghi thời điểm tạo và cập nhật cuối.

Ví dụ minh họa

Tạo bảng DemoTable737 (cột StudentAdmissiondate kiểu DATETIME):

mysql> CREATE TABLE DemoTable737 (
    StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentName VARCHAR(100),
    StudentAdmissiondate DATETIME
);
Query OK, 0 rows affected (0.68 sec)

Thêm DEFAULT và ON UPDATE cho cột hiện có:

mysql> ALTER TABLE DemoTable737 
MODIFY COLUMN StudentAdmissiondate TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
Query OK, 0 rows affected (2.20 sec)
Records: 0 Duplicates: 0 Warnings: 0

Kiểm tra cấu trúc bảng:

mysql> DESC DemoTable737;
+----------------------+--------------+------+-----+-------------------+-----------------------------+
| Field                | Type         | Null | Key | Default           | Extra                       |
+----------------------+--------------+------+-----+-------------------+-----------------------------+
| StudentId            | int(11)      | NO   | PRI | NULL              | auto_increment              |
| StudentName          | varchar(100) | YES  |     | NULL              |                             |
| StudentAdmissiondate | timestamp    | YES  |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+----------------------+--------------+------+-----+-------------------+-----------------------------+
3 rows in set (0.01 sec)

Giải thích

  • DEFAULT CURRENT_TIMESTAMP: Khi INSERT không chỉ định cột này → tự động ghi thời điểm hiện tại
  • ON UPDATE CURRENT_TIMESTAMP: Khi UPDATE hàng (bất kỳ cột nào) → tự động cập nhật cột này = thời điểm hiện tại
  • Cột tự động chuyển sang kiểu TIMESTAMP (MySQL yêu cầu)

Hành vi chi tiết

Thao tácGiá trị cột
INSERT không chỉ định cộtCURRENT_TIMESTAMP (thời điểm insert)
INSERT có chỉ định cộtGiá trị chỉ định (ghi đè default)
UPDATE không thay đổi cột nàyCURRENT_TIMESTAMP (tự động cập nhật)
UPDATE có thay đổi cột nàyGiá trị mới chỉ định (ghi đè auto-update)

Tạo bảng mới trực tiếp (không cần ALTER)

CREATE TABLE DemoTable737 (
    StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentName VARCHAR(100),
    CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    UpdatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Lưu ý quan trọng

  • Chỉ 1 cột TIMESTAMP được phép có DEFAULT CURRENT_TIMESTAMP trong bảng (MySQL < 5.6). MySQL 5.6+ cho phép nhiều cột.
  • TIMESTAMP phạm vi: 1970-01-01 đến 2038-01-19 (Year 2038 problem). Dùng DATETIME cho phạm vi rộng hơn (MySQL 5.6+ hỗ trợ DEFAULT/ON UPDATE trên DATETIME).
  • Múi giờ: TIMESTAMP lưu UTC, hiển thị theo timezone session. DATETIME lưu giá trị gốc không chuyển đổi.
  • Để tắt auto-update: ALTER TABLE ... MODIFY col TIMESTAMP DEFAULT CURRENT_TIMESTAMP (bỏ ON UPDATE)