CREATE TABLE A (
id INT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE B (
id INT PRIMARY KEY,
a_id INT,
data VARCHAR(100),
FOREIGN KEY (a_id) REFERENCES A(id) ON DELETE CASCADE -- 關鍵:級聯刪除
);
定義外鍵時指定 ON DELETE CASCADE,刪除 A 表記錄時自動刪除 B 表關聯記錄。
DELIMITER //
CREATE PROCEDURE DeleteA(IN p_id INT)
BEGIN
DELETE FROM A WHERE id = p_id; -- B 表自動級聯刪除
END //
DELIMITER ;
DELIMITER //
CREATE PROCEDURE DeleteA_Explicit(IN p_id INT)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL; -- 重新拋出異常
END;
START TRANSACTION;
DELETE FROM B WHERE a_id = p_id; -- 先刪子表
DELETE FROM A WHERE id = p_id; -- 再刪父表
COMMIT;
END //
DELIMITER ;
ALTER TABLE A ADD COLUMN is_deleted TINYINT DEFAULT 0;
ALTER TABLE B ADD COLUMN is_deleted TINYINT DEFAULT 0;
CREATE PROCEDURE SoftDeleteA(IN p_id INT)
BEGIN
UPDATE A SET is_deleted = 1 WHERE id = p_id;
UPDATE B SET is_deleted = 1 WHERE a_id = p_id;
END