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ạiON 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ác | Giá trị cột |
|---|---|
| INSERT không chỉ định cột | CURRENT_TIMESTAMP (thời điểm insert) |
| INSERT có chỉ định cột | Giá trị chỉ định (ghi đè default) |
| UPDATE không thay đổi cột này | CURRENT_TIMESTAMP (tự động cập nhật) |
| UPDATE có thay đổi cột này | Giá 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.
TIMESTAMPphạm vi:1970-01-01đến2038-01-19(Year 2038 problem). DùngDATETIMEcho phạm vi rộng hơn (MySQL 5.6+ hỗ trợ DEFAULT/ON UPDATE trên DATETIME).- Múi giờ:
TIMESTAMPlưu UTC, hiển thị theo timezone session.DATETIMElư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)