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

Thực hiện DELETE trong MySQL Stored Procedure với tham số

Để xóa dữ liệu an toàn và tái sử dụng được, gói câu lệnh DELETE vào Stored Procedure nhận tham số đầu vào (IN). Điều này tránh SQL Injection, tập trung logic nghiệp vụ, và dễ bảo trì.

Ví dụ minh họa

Tạo bảng:

mysql> CREATE TABLE DemoTable1464 (
    Id INT,
    FirstName VARCHAR(20)
);

Chèn dữ liệu:

mysql> INSERT INTO DemoTable1464 VALUES (101, 'Chris Brown');
mysql> INSERT INTO DemoTable1464 VALUES (102, 'John Doe');

Dữ liệu:

mysql> SELECT * FROM DemoTable1464;
+------+-------------+
| Id   | FirstName   |
+------+-------------+
|  101 | Chris Brown |
|  102 | John Doe    |
+------+-------------+

Tạo Stored Procedure DELETE có tham số

mysql> DELIMITER //
mysql> CREATE PROCEDURE delete_demo(IN local_Id INT, IN local_Name VARCHAR(20))
    BEGIN
        DELETE FROM DemoTable1464
        WHERE Id = local_Id
          AND FirstName = local_Name;
    END //
Query OK, 0 rows affected (0.24 sec)

mysql> DELIMITER ;

Gọi Procedure để xóa

mysql> CALL delete_demo(102, 'John Doe');
Query OK, 1 row affected, 1 warning (0.11 sec)

Kiểm tra lại (hàng Id=102 đã bị xóa):

mysql> SELECT * FROM DemoTable1464;
+------+-------------+
| Id   | FirstName   |
+------+-------------+
|  101 | Chris Brown |
+------+-------------+

Giải thích

  • IN local_Id INT: Tham số đầu vào kiểu INT.
  • IN local_Name VARCHAR(20): Tham số đầu vào kiểu chuỗi.
  • WHERE Id = local_Id AND FirstName = local_Name: Điều kiện xóa chính xác (tránh xóa nhầm).
  • DELIMITER // ... DELIMITER ;: Đổi ký tự kết thúc câu lệnh để định nghĩa procedure chứa dấu ; bên trong.

Mở rộng: Procedure xóa an toàn hơn

CREATE PROCEDURE safe_delete(
    IN p_table VARCHAR(64),       -- Tên bảng (dynamic SQL)
    IN p_id INT,                  -- ID cần xóa
    OUT p_affected INT            -- Số hàng bị xóa
)
BEGIN
    SET @sql = CONCAT('DELETE FROM `', p_table, '` WHERE Id = ?');
    PREPARE stmt FROM @sql;
    SET @id = p_id;
    EXECUTE stmt USING @id;
    DEALLOCATE PREPARE stmt;
    SELECT ROW_COUNT() INTO p_affected;
END;

Lưu ý bảo mật & hiệu năng

  • SQL Injection: Procedure với tham số IN an toàn (parameterized). Tránh CONCAT trực tiếp giá trị vào SQL string.
  • Transaction: Nếu xóa nhiều bảng liên quan, bọc trong START TRANSACTION ... COMMIT/ROLLBACK.
  • Foreign Key: Nếu bảng con tham chiếu (FK), xóa cha sẽ lỗi trừ khi ON DELETE CASCADE hoặc xóa con trước.
  • Soft Delete: Thay vì DELETE, cân nhắc UPDATE SET DeletedAt = NOW() + index trên DeletedAt.