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

Cách cộng giá trị vào mỗi hàng (cập nhật hàng loạt) trong MySQL

Để 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àmCú phápVí dụ
DATE_ADDDATE_ADD(date, INTERVAL expr unit)DATE_ADD(d, INTERVAL 5 DAY)
ADDDATEADDDATE(date, INTERVAL expr unit)Alias của DATE_ADD
DATE_SUBDATE_SUB(date, INTERVAL expr unit)Trừ khoảng thời gian
SUBDATESUBDATE(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 SELECT trước để xem trước kết quả: SELECT Id, Amount, Amount+20 FROM bang;
  • Xử lý NULL: NULL + 20 = NULL → Dùng COALESCE(cot, 0) + 20 hoặc IFNULL
  • 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;