2012-12-20 40 views
0

我想爲我的表table_master創建觸發器。MySQL觸發器:檢查主鍵ID是否在其他表中使用

table_master表架構很簡單:

master_id  INT(11)  AUTO_INCREMENT, PRIMARY, NOT NULL 
title   VARCHAR(50) NOT NULL 

,這裏是另一個關係表rel_master_another_tbl

master_id  INT(11)  PRIMARY, NOT NULL 
another_id  INT(11)  PRIMARY, NOT NULL 

我想實現的是,當DELETE查詢上table_master發出後,觸發器將檢查在rel_master_another_tbl中是否使用master_idUPDATE:如果是,則回滾/取消DELETE查詢。

我該如何做到這一點?

CREATE TRIGGER check_before_delete BEFORE DELETE ON table_master 
// what should I put here? 
END; 
+1

檢查並做什麼?使用ON DELETE RESTRICT觸發器可以在表之間定義外鍵約束時編寫代碼似乎很簡單。 – Perception

+0

我想停止DELETE查詢,一旦發現ID正在使用 – Raptor

+0

,這正是* ON DELETE RESTRICT觸發器所做的。如果嘗試刪除外鍵所引用的父表中的行,它將停止查詢繼續。 – Perception

回答

1

您嘗試執行的行爲已經存在於數據庫中,可以通過ON DELETE RESTRICT觸發器使用。在定義表,以利用這個的一個例子如下所示:

CREATE TABLE `master` (
    `master_id` int(11) NOT NULL AUTO_INCREMENT, 
    `title` varchar(50) DEFAULT NULL, 
    PRIMARY KEY (`master_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE TABLE `rel_master_another_tbl` (
    `master_id` int(11) NOT NULL, 
    `another_id` int(11) NOT NULL, 
    KEY `i_master_id` (`master_id`), 
    FOREIGN KEY `fk_rel_master_another_tbl_master` (`master_id`) 
     REFERENCES `master` (`id`) ON DELETE RESTRICT 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

RESTRICT在此上下文中意味着試圖刪除從master表的行會失敗,如果有在rel_master_another_tbl對應行被參照掌握id列。另外,不要注意RESTRICT是兩個ON DELETEON UPDATE觸發器外鍵,這樣你實際上可以定義外鍵的默認選項,如下圖所示,它仍然會發揮作用是相同的:

FOREIGN KEY `fk_rel_master_another_tbl_master` (`master_id`) 
    REFERENCES `master` (`id`) 

可以參閱MySQL有關foreign key constraints的文檔以獲取更多信息。

+0

感謝您的詳細解答和參考鏈接! – Raptor

0

如果你想檢查是否在另一個表存在這個ID,那麼你可以做到這一點是這樣的:

DELIMITER $$ 

CREATE TRIGGER check_before_delete BEFORE DELETE ON table_master 
FOR EACH ROW 
BEGIN 

DECLARE has_row TINYINT; 

SELECT 1 
INTO has_row 
FROM rel_master_another_tbl 
WHERE master_id = OLD.master_id; 

IF has_row IS NOT NULL THEN 
// PUT YOUR CODE HERE 
END IF; 

END$$ 

但是檢查有關設置表之間的鍵約束,並使用ON DELETE RESTRICT觸發作爲這種看法的評論可以解決您的問題。

相關問題