Bài 4. INSERT, UPDATE, DELETE

Ba lệnh thay đổi dữ liệu: thêm bản ghi, cập nhật và xóa. Bài này học cú pháp đầy đủ, thêm nhiều dòng, thêm từ truy vấn, cập nhật có điều kiện, xóa an toàn và giao dịch (transaction) để bảo đảm toàn vẹn.

40 phútCơ bản
Bạn sẽ học được
  • INSERT một hoặc nhiều dòng, INSERT ... SELECT
  • UPDATE với WHERE, cập nhật dựa trên giá trị cũ
  • DELETE có điều kiện, phân biệt với TRUNCATE
  • Dùng transaction cho thao tác nhiều bước

Khái niệm và lý thuyết

Quy tắc sống còn: UPDATE và DELETE luôn đi kèm WHERE; thiếu WHERE sẽ sửa/xóa toàn bộ bảng. Thói quen tốt: viết SELECT ... WHERE điều_kiện trước để xem những dòng sẽ bị ảnh hưởng, rồi mới đổi thành UPDATE/DELETE với cùng WHERE.

INSERT

INSERT INTO lop (ma_lop, ten_lop, khoa) VALUES ('K67TIN', 'K67 ĐHSP Tin học', 'KHTN&CN');
-- Nhiều dòng một lần (nhanh hơn nhiều lệnh)
INSERT INTO monhoc (ma_mon, ten_mon, so_tin_chi) VALUES
  ('ICT0045', 'Lập trình Python', 3),
  ('ICT0050', 'Mạng máy tính', 2);
-- Cột không ghi sẽ nhận DEFAULT hoặc NULL; id tự tăng
INSERT INTO sinhvien (ma_sv, ho_ten, lop_id) VALUES ('SV007', 'Tòng Văn Giang', 4);
SELECT LAST_INSERT_ID();                       -- id vừa sinh
-- Thêm từ truy vấn khác
INSERT INTO diem (sinhvien_id, monhoc_id, hoc_ky)
SELECT id, 1, 'HK1' FROM sinhvien WHERE lop_id = 4;
-- Thêm hoặc cập nhật nếu trùng khóa
INSERT INTO lop (ma_lop, ten_lop) VALUES ('K67TIN', 'K67 Sư phạm Tin')
ON DUPLICATE KEY UPDATE ten_lop = VALUES(ten_lop);

UPDATE

UPDATE sinhvien SET email = Địa chỉ email này đang được bảo vệ từ spam bots, bạn cần kích hoạt Javascript để xem nó. Bạn cần kích hoạt Javascript để xem nó.' WHERE ma_sv = 'SV007';
UPDATE sinhvien SET que_quan = 'Sơn La', gioi_tinh = 'Nam' WHERE id = 7;   -- nhiều cột
UPDATE diem SET diem = diem + 0.5 WHERE monhoc_id = 1 AND diem < 9.5;       -- dựa trên giá trị cũ
UPDATE diem SET diem = LEAST(diem + 0.5, 10) WHERE hoc_ky = 'HK1';
UPDATE sinhvien SET email = CONCAT(LOWER(ma_sv), Địa chỉ email này đang được bảo vệ từ spam bots, bạn cần kích hoạt Javascript để xem nó. Bạn cần kích hoạt Javascript để xem nó.') WHERE email IS NULL;
-- Cập nhật theo bảng khác
UPDATE sinhvien sv JOIN lop l ON l.id = sv.lop_id SET sv.que_quan = 'Sơn La' WHERE l.ma_lop = 'K67TIN';

DELETE và TRUNCATE

SELECT * FROM diem WHERE diem IS NULL;      -- xem trước
DELETE FROM diem WHERE diem IS NULL;
DELETE FROM sinhvien WHERE ma_sv = 'SV007'; -- diem liên quan cũng bị xóa nhờ ON DELETE CASCADE
DELETE FROM diem WHERE sinhvien_id IN (SELECT id FROM sinhvien WHERE lop_id = 4);
DELETE FROM diem ORDER BY id DESC LIMIT 1;  -- xóa dòng mới nhất
TRUNCATE TABLE diem;                        -- xóa hết, đặt lại AUTO_INCREMENT, không hoàn tác
DELETETRUNCATE
Điều kiện WHERECóKhông
Tốc độChậm hơnRất nhanh
Đặt lại AUTO_INCREMENTKhôngCó
Hoàn tác bằng ROLLBACKCóKhông

Transaction

START TRANSACTION;
  INSERT INTO sinhvien (ma_sv, ho_ten, lop_id) VALUES ('SV008', 'Lò Thị Hoa', 2);
  INSERT INTO diem (sinhvien_id, monhoc_id, diem, hoc_ky) VALUES (LAST_INSERT_ID(), 1, 8, 'HK1');
COMMIT;      -- cả hai cùng thành công
-- Nếu có lỗi ở giữa: ROLLBACK; -> hủy toàn bộ, CSDL trở lại như trước

Transaction bảo đảm nhóm lệnh “tất cả hoặc không gì cả”: chuyển tiền, đăng ký học phần (trừ chỗ + ghi danh sách). Bảng phải dùng engine InnoDB (mặc định).

Mẹo hay

Trong phpMyAdmin, tab SQL có ô “Simulate query” (mô phỏng) cho UPDATE/DELETE: cho biết số dòng sẽ bị ảnh hưởng mà chưa thực hiện.

Lưu ý

Trước khi chạy UPDATE/DELETE trên dữ liệu thật, Export sao lưu. Đã xóa trong MySQL không có “thùng rác”.

Thực hành
  1. Thêm 2 sinh viên mới vào lớp K66CNTT bằng một lệnh INSERT.
  2. Cộng 1 điểm cho mọi sinh viên lớp K65 ở môn Thiết kế Web, không vượt 10.
  3. Xóa các dòng điểm NULL sau khi xem trước bằng SELECT.
  4. Viết transaction thêm môn học mới và ghi điểm cho 3 sinh viên.
Tóm tắt bài học
  • INSERT INTO bảng (cột) VALUES (...), (...); INSERT ... SELECT.
  • UPDATE ... SET ... WHERE; dùng được giá trị cũ, hàm, JOIN.
  • DELETE ... WHERE; TRUNCATE xóa toàn bộ.
  • SELECT trước, UPDATE/DELETE sau; transaction cho thao tác nhiều bước.