Để cộng một giá trị cố định vào tất cả các hàng của một cột số hoặc ngày, bạn dùng lệnh UPDATE không có mệnh đề WHERE (hoặc WHERE 1=1).
Cú pháp cho cột số (INT, DECIMAL, FLOAT...)
-- Cộng giá trị vào tất cả hàng
UPDATE ten_bang SET ten_cot_so = ten_cot_so + gia_tri_cong;
-- Xử lý NULL trước (NULL + số = NULL)
UPDATE ten_bang SET ten_cot_so = COALESCE(ten_cot_so, 0) + gia_tri_cong;
-- Hoặc
UPDATE ten_bang SET ten_cot_so = ten_cot_so + gia_tri_cong WHERE ten_cot_so IS NOT NULL;
UPDATE ten_bang SET ten_cot_so = gia_tri_cong WHERE ten_cot_so IS NULL;
Cú pháp cho cột ngày (DATE, DATETIME)
-- Cộng ngày/tháng/năm
UPDATE ten_bang SET ten_cot_ngay = DATE_ADD(ten_cot_ngay, INTERVAL 1 MONTH);
UPDATE ten_bang SET ten_cot_ngay = ADDDATE(ten_cot_ngay, INTERVAL 10 DAY);
UPDATE ten_bang SET ten_cot_ngay = ten_cot_ngay + INTERVAL 1 YEAR; -- MySQL cho phép
Ví dụ minh họa
1. Tạo bảng
CREATE TABLE addEachRowValue (
Id INT NOT NULL AUTO_INCREMENT,
Amount INT,
ShippingDate DATE,
PRIMARY KEY(Id)
);
2. Chèn dữ liệu
INSERT INTO addEachRowValue(Amount, ShippingDate) VALUES
(100, '2019-02-21'),
(10, '2013-04-22'),
(110, '2015-10-25'),
(150, '2016-03-27'),
(190, '2018-12-29');
3. Xem dữ liệu gốc
SELECT * FROM addEachRowValue;
Kết quả:
+----+--------+--------------+
| Id | Amount | ShippingDate |
+----+--------+--------------+
| 1 | 100 | 2019-02-21 |
| 2 | 10 | 2013-04-22 |
| 3 | 110 | 2015-10-25 |
| 4 | 150 | 2016-03-27 |
| 5 | 190 | 2018-12-29 |
+----+--------+--------------+
4. Cộng 20 vào cột Amount (số nguyên)
UPDATE addEachRowValue SET Amount = Amount + 20;
Kết quả:
+--------+
| Amount |
+--------+
| 120 |
| 30 |
| 130 |
| 170 |
| 210 |
+--------+
5. Cộng 1 tháng vào cột ShippingDate (ngày)
UPDATE addEachRowValue SET ShippingDate = ADDDATE(ShippingDate, INTERVAL 1 MONTH);
Kết quả:
+--------------+
| ShippingDate |
+--------------+
| 2019-03-21 |
| 2013-05-22 |
| 2015-11-25 |
| 2016-04-27 |
| 2019-01-29 |
+--------------+
Các hàm ngày tháng hữu ích
| Hàm | Cú pháp | Ví dụ |
|---|---|---|
DATE_ADD | DATE_ADD(date, INTERVAL expr unit) | DATE_ADD(d, INTERVAL 5 DAY) |
ADDDATE | ADDDATE(date, INTERVAL expr unit) | Alias của DATE_ADD |
DATE_SUB | DATE_SUB(date, INTERVAL expr unit) | Trừ khoảng thời gian |
SUBDATE | SUBDATE(date, INTERVAL expr unit) | Alias của DATE_SUB |
Đơn vị thời gian (unit) phổ biến
MICROSECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR
SECOND_MICROSECOND, MINUTE_MICROSECOND, MINUTE_SECOND, HOUR_MICROSECOND,
HOUR_SECOND, HOUR_MINUTE, DAY_MICROSECOND, DAY_SECOND, DAY_MINUTE, DAY_HOUR,
YEAR_MONTH
⚠️ Lưu ý quan trọng
- Không có WHERE = cập nhật TẤT CẢ hàng - Rất nguy hiểm trên production
- Luôn
SELECTtrước để xem trước kết quả:SELECT Id, Amount, Amount+20 FROM bang; - Xử lý NULL:
NULL + 20 = NULL→ DùngCOALESCE(cot, 0) + 20hoặcIFNULL - Backup trước khi UPDATE hàng loạt:
CREATE TABLE bang_backup AS SELECT * FROM bang; - Giao dịch (transaction) cho an toàn:
START TRANSACTION; UPDATE ...; COMMIT;/ROLLBACK;