hocvietcode.com
  • Trang chủ
  • Học lập trình
    • Lập trình C/C++
    • Cấu trúc dữ liệu và giải thuật
    • Lập trình HTML
    • Lập trình Javascript
      • Javascript cơ bản
      • ReactJS framework
      • AngularJS framework
      • Typescript cơ bản
      • Angular
    • Lập trình Mobile
      • Lập Trình Dart Cơ Bản
        • Dart Flutter Framework
    • Cơ sở dữ liệu
      • MySQL – MariaDB
      • Micrsoft SQL Server
      • Extensible Markup Language (XML)
      • JSON
    • Lập trình PHP
      • Lập trình PHP cơ bản
      • Laravel Framework
    • Lập trình Java
      • Java Cơ bản
    • Lập trình C#
      • Lập Trình C# Cơ Bản
      • ASP.NET Core MVC
    • Machine Learning
  • WORDPRESS
    • WordPress cơ bản
    • WordPress nâng cao
    • Chia sẻ WordPress
  • Kiến thức hệ thống
    • Microsoft Azure
    • Docker
    • Linux
  • Chia sẻ IT
    • Tin học văn phòng
      • Microsoft Word
      • Microsoft Excel
    • Marketing
      • Google Adwords
      • Facebook Ads
      • Kiến thức khác
    • Chia sẻ phần mềm
    • Review công nghệ
    • Công cụ – tiện ích
      • Kiểm tra bàn phím online
      • Kiểm tra webcam online
Đăng nhập
  • Đăng nhập / Đăng ký

Please enter key search to display results.

Home
  • MySQL
Xử lý lỗi trong MySQL

Xử lý lỗi trong MySQL

  • 18-12-2025
  • Toanngo92
  • 0 Comments

ySQL dùng HANDLER để “bắt lỗi” khi có sự cố xảy ra trong:

  • Stored Procedure
  • Function
  • Trigger

👉 Cách hoạt động:

  • Khai báo HANDLER
  • Khi lỗi xảy ra → MySQL tự động nhảy vào HANDLER

Mục lục

  • 2. Cú pháp tương đương TRY – CATCH
    • 🔹 Cấu trúc tổng quát
    • Trong đó:
  • 3. Ví dụ đơn giản (tương đương TRY – CATCH)
    • Ví dụ: INSERT lỗi thì rollback
  • 4. Ví dụ CONTINUE (không dừng chương trình)
  • 5. Ví dụ bắt lỗi “không tìm thấy dữ liệu”
  • 6. So sánh nhanh với TRY CATCH (để dễ hiểu)
  • 7. Tự phát sinh lỗi (giống THROW)
  • 8. Lưu ý quan trọng (hay bị sai)

2. Cú pháp tương đương TRY – CATCH

🔹 Cấu trúc tổng quát

DECLARE handler_type HANDLER FOR condition_value
BEGIN
    -- code xử lý lỗi
END;

Trong đó:

  • handler_type
    • CONTINUE → tiếp tục chạy
    • EXIT → dừng procedure ngay
  • condition_value
    • SQLEXCEPTION → mọi lỗi SQL
    • SQLWARNING → cảnh báo
    • NOT FOUND → không có dữ liệu (hay dùng với cursor)

3. Ví dụ đơn giản (tương đương TRY – CATCH)

Ví dụ: INSERT lỗi thì rollback

DELIMITER //

CREATE PROCEDURE insert_user()
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        SELECT 'Có lỗi xảy ra, đã rollback' AS message;
    END;

    START TRANSACTION;

    INSERT INTO users(name) VALUES ('Toàn');
    INSERT INTO users(name) VALUES (NULL); -- lỗi nếu name NOT NULL

    COMMIT;
END;
//
DELIMITER ;

👉 Ý nghĩa:

  • Nếu bất kỳ lỗi SQL nào xảy ra
  • MySQL tự động nhảy vào HANDLER
  • ROLLBACK được gọi
  • Procedure kết thúc (do EXIT)

4. Ví dụ CONTINUE (không dừng chương trình)

DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
SET @has_error = 1;

→ Dùng khi:

  • Muốn ghi log lỗi
  • Vẫn cho code chạy tiếp

5. Ví dụ bắt lỗi “không tìm thấy dữ liệu”

DECLARE done INT DEFAULT 0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

👉 Thường dùng trong CURSOR loop


6. So sánh nhanh với TRY CATCH (để dễ hiểu)

Ngôn ngữ khácMySQL
TRYCode chính trong BEGIN
CATCHDECLARE HANDLER
THROWSIGNAL
FINALLYKhông có trực tiếp

7. Tự phát sinh lỗi (giống THROW)

SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Lỗi nghiệp vụ';

👉 Dùng khi:

  • Kiểm tra điều kiện nghiệp vụ
  • Chủ động dừng procedure

8. Lưu ý quan trọng (hay bị sai)

❌ Không dùng được HANDLER ngoài procedure/trigger
❌ HANDLER phải khai báo trước các câu lệnh SQL
✅ Một procedure có thể có nhiều handler

Bài tập

Tạo database QuanlyNhanKhau

Tạo bảng QuanHuyen

Column Datatype Constraint Description
MaQH INT auto_increment NOT NULL Mã quận huyện
TenQH NVARCHAR(100)   Tên quận huyện

Tạo bảng DuongPho

Column Datatype Constraint Description
DuongID INT NOT NULL Mã đươờng
MaQH INT NOT NULL Mã quận huyện
TenDuong NVARCHAR(MAX) NOT NULL Tên Đường
NgayDuyet DATETIME NOT NULL Ngày duyệt tên

Tạo bảng NhaTrenPho

Column Datatype Constraint Description
NhaID INT NOT NULL Mã nhà
DuongID INT NOT NULL Mã đường
ChuHo NVARCHAR(50) NULL Chủ hộ
DienTich MONEY NULL Diện tích
SoNhanKhau int   số nhân khẩu

Tạo ràng buộc cho các bảng:

Primary key

Constraint Name Table Applied Column
PK_QuanHuyen QuanHuyen MaQH
PK_DuongPho DuongPho DuongID
PK_NhaTrenPho NhaTrenPho NhaID

Foreign key

Constraint Name Referencing Table Foreign Key column Referrenced Table Referenced Column
FK_NhaTrenPho_DuongPho NhaTrenPho DuongID DuongPho DuongID
FK_DuongPho_QuanHuyen DuongPho MaQH QuanHuyen MaQH

 

 

Nhập lệu vào bảng thông tin sau:

Lưu ý, khi nhập dữ liệu datetime, có thể sử dụng chuỗi 'yyyy-mm-dd' 

QuanHuyen:

MaQH TenQH
1 Ba Đình
2 Hoàng Mai

DuongPho:

DuongId MaQH TenDuong NgayDuyetTen(dd/mm/yyyy)
1 1 Trường Chinh 19/10/1946
2 1 Tây Sơn 30/12/1998
3 2 Chùa Bộc 21/09/1975

NhaTrenPho:

NhaID DuongID ChuHo DienTich SoNhanKhau
1 1 Toàn Ngô Vĩnh 100 4
2 1 Lê Văn A 20 12
3 2 Nguyễn Thị B 40 1

Sửa bảng (ALTER TABLE) DuongPho, cột [TenDuong] từ 'Chùa Bộc' thành 'Thái Hà'

Tạo view có tên vw_All_NhaTrenPho với dữ lệu từ 3 bảng: [Nha_Tren_Pho],[DuongPho] và [QuanHuyen]

thực thi view [vw_All_NhaTrenPho]

Tạo view có tên là `[view_AVG_NhaTrenPho]` để tổng hợp dữ liệu trung bình từ 2 bảng `[NhaTrenPho]` và `[DuongPho]`.
-Thực thi view `[view_AVG_NhaTrenPho]` để hiển thị thông tin.

Thực thi view trên để kết quả hiển thị như hình

TenDuong Dientichtrungbinh Nhankhautrungbinh
Trường Chinh 40 1
Tây Sơn 100 8

Sắp xếp theo thứ tự tăng dần của trung bình [Dientich] và trung bình [SonhanKhau] (Ví dụ: ORDER BY AVG_Dientich ASC, AVG_SoNhanKhau ASC).

Tạo procedured có tên [sp_NgayDuyetTen_DuongPho] với tham số truyền vào:

Parameter Data Type
@NgayDuyet DATETIME

Procedure sẽ làm nghiệp vụ lấy ra toàn bộ đường có ngày duyệt tên là ngày nhập liệu

Thực thi procedure [sp_NgayDuyetTen_DuongPHo] NgayDuyetTen = @NgayDuyet

Chạy Procedure với tham số @NgayDuyet='30/12/1998' (sử dụng date time convert hoặc chuỗi năm tháng ngày)

Kết quả trả ra mô phỏng:

Ngay Duyet Ten Ten Duong Ten Quan Huyen
1998-12-30 00:00:00.000 Vạn Phúc Ba đình

 

Tạo trigger có tên [TG_NhaTrenPho_Update] để kiểm tra giá trị cột [SoNhanKhau]

  • Nếu giá trị nhỏ hơn 0, rollback lại và không thực hiện cập nhâật.
  • Nếu giá trị lớn hơn 0, cho phép cập nhật.
Trigger Name For Event Table Fired Condition Error Message
TG_NhaTrenPho_Update UPDATE NhaTrenPho SoNhanKhau < 0 SoNhanKhau phai lon hon 0

Tạo trigger có tên [TG_DuongPho_Instead_Of_Delete] cho bảng [DuongPho]

Trigger Name For Event Table Error Message
TG_DuongPho_Instead_Of_Delete DELETE DuongPho Khong xoa duoc duong pho

Bài viết liên quan:

TCL Trong MySQL – Quản Lý Giao Dịch Với COMMIT, ROLLBACK, SAVEPOINT
FUNCTION Trong MySQL – Định Nghĩa Hàm Tùy Chỉnh Trả Về Giá Trị
TRIGGER Trong MySQL – Kích Hoạt Tự Động Khi Dữ Liệu Thay Đổi
Giao Dịch (Transaction) Trong MySQL — START TRANSACTION, COMMIT, ROLLBACK
Stored Procedure Trong MySQL — thủ tục lưu trữ
Tăng Tốc Truy Vấn Dữ Liệu Với INDEX Trong MySQL
VIEW Trong MySQL — Bảng Ảo Từ Truy Vấn
Điều Kiện Trong Truy Vấn Với CASE WHEN và Wildcard, REGEXP trong MySQL
Truy Vấn Con (SUBQUERY) và Biểu Thức Bảng Chung (CTE) Trong MySQL
Kết Hợp Dữ Liệu Từ Nhiều Bảng Với JOIN Trong MySQL
Hàm Tổng Hợp và Nhóm Dữ Liệu Trong MySQL: GROUP BY, HAVING
Truy Vấn Dữ Liệu Với SELECT Trong MySQL

THÊM BÌNH LUẬN Cancel reply

Dịch vụ thiết kế Wesbite

NỘI DUNG MỚI CẬP NHẬT

Xử lý lỗi trong MySQL

Data Types (kiểu dữ liệu) trong MySQL

Xác thực người dùng, tính năng đăng ký đăng nhập trong PHP

Truy Vấn Dữ Liệu Với SELECT Trong MySQL

Gửi Email trong PHP

Giới thiệu

hocvietcode.com là website chia sẻ và cập nhật tin tức công nghệ, chia sẻ kiến thức, kỹ năng. Chúng tôi rất cảm ơn và mong muốn nhận được nhiều phản hồi để có thể phục vụ quý bạn đọc tốt hơn !

Liên hệ quảng cáo: [email protected]

Kết nối với HỌC VIẾT CODE

© hocvietcode.com - Tech888 Co .Ltd since 2019

Đăng nhập

Trở thành một phần của cộng đồng của chúng tôi!
Registration complete. Please check your email.
Đăng nhập bằng google
Đăng kýBạn quên mật khẩu?

Create an account

Welcome! Register for an account
The user name or email address is not correct.
Registration confirmation will be emailed to you.
Log in Lost your password?

Reset password

Recover your password
Password reset email has been sent.
The email could not be sent. Possible reason: your host may have disabled the mail function.
A password will be e-mailed to you.
Log in Register
×