Mysql
如何在沒有 UDF 的情況下使用 EER 設計在 mysql 工作台中添加觸發器
我在工作台中使用 EER 設計了一個簡單的數據庫。但是,我希望屬性薪水有一個最小值(與藝術家表中的 min_value 屬性相比)。這是架構:
這是 EER mysql 工作台中的等價物:
我需要檢查每個表演電影的藝術家的薪水是否有最小值(比如說 1000),但我應該怎麼做呢?我已經檢查了選項,我看到的只是:
-- Trigger DDL Statements DELIMITER $$ USE `Askisi_3db`$$
我應該使用類似的東西:
CREATE TRIGGER min_salary BEFORE INSERT OR UPDATE OF salary, min_salary ON acts, artist FOR EACH ROW WHEN (new.salary < min_salary) BEGIN RAISE_APPLICATION_ERROR (-20004, ‘Violation of Minimum Actor Salary’); END; . run;
問題是該屬性處於 NM 關係中,並且必須檢查其他表中的鍵。薪水只對作為演員參與電影的藝術家很重要,對導演或作家不重要。然而,並不是每個藝術家都必須有一個 min_salary(對於一些作為導演或作家參與的人來說可能是空的)。這是否僅通過 UDF 功能或前端設計可行?我真的很想要一個簡單而整潔的解決方案:) 請不要就架構如何變得更好提出建議,我所要問的是這個特定設計如何實現薪水和 min_salary 之間的檢查
觸發器可能是這樣的:
DELIMITER $$ CREATE TRIGGER acts_INSERT_min_salary BEFORE INSERT ON acts FOR EACH ROW BEGIN DECLARE msg VARCHAR(255); IF NEW.salary < ( SELECT min_salary FROM artist WHERE artist_id = NEW.artist_artist_id ) THEN SET msg = 'Violation of Minimum Actor Salary.' ; SIGNAL SQLSTATE '45000' SET message_text = msg ; END IF ; END ; $$ DELIMITER ;
您將需要一個類似的觸發器來進行
UPDATE
操作,acts
而另一個觸發器用於表UPDATE
上的操作artist
:CREATE TRIGGER artist_UPDATE_min_salary BEFORE UPDATE ON artist FOR EACH ROW BEGIN DECLARE msg VARCHAR(255); IF NEW.min_salary > -- this part ( SELECT MIN(salary) -- is slightly FROM acts -- different than WHERE artist_artist_id = NEW.artist_id -- the other ) THEN SET msg = 'Violation of Minimum Actor Salary.' ; SIGNAL SQLSTATE '45000' SET message_text = msg ; END IF ; END ;
為什麼不將所有電影參與者儲存在一張表中?那麼關係很簡單,您只需要為特定類型的參與強制執行最低工資:
CREATE TABLE involvement_type ( involvement_type_id INT NOT NULL PRIMARY KEY, description varchar(100) ) --Instead of acts,directs,writes you will have just one table CREATE TABLE movie_participant ( movie_id,participant_id, involvement_type_id, salary -- PK is (movie_id,participant_id, involvement_type_id) assuming -- one person can be involved in different ways, say artist and director -- each of (movie_id,participant_id, involvement_type_id) is FK to appropriate table )
另外,我不會使用 movie.title 作為主鍵。即使您出於某種充分的理由更喜歡自然 pk 而不是代理,標題本身也無法辨識電影(我不熟悉電影域,但我猜標題只是唯一約束的一部分)