Mysql

如何在沒有 UDF 的情況下使用 EER 設計在 mysql 工作台中添加觸發器

  • September 6, 2017

我在工作台中使用 EER 設計了一個簡單的數據庫。但是,我希望屬性薪水有一個最小值(與藝術家表中的 min_value 屬性相比)。這是架構: ER

這是 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 而不是代理,標題本身也無法辨識電影(我不熟悉電影域,但我猜標題只是唯一約束的一部分)

引用自:https://dba.stackexchange.com/questions/33326