Để 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ố
INan toàn (parameterized). TránhCONCATtrự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 CASCADEhoặc xóa con trước. - Soft Delete: Thay vì DELETE, cân nhắc
UPDATE SET DeletedAt = NOW()+ index trênDeletedAt.