2016-08-24 89 views
0

感謝您閱讀本文。「不包含」約束?

我有這樣的表中MySQL

enter image description here

Device表有名稱的列表。並且ReservedName表具有「保留」名稱列表的列表。

正如你可以看到,我的設計理念是讓DeviceName值不應ReservedNameName之一。

當我對Device表執行INSERT操作時,我可以通過添加幾條SQL語句輕鬆實現此關係。但是我想知道表格模式中是否存在類似「不是」約束的東西?也許與FOREIGN KEY的意義相反?如果有任何其他方式來建立這種關係也是受歡迎的。

+0

您正在查找檢查約束。 http://stackoverflow.com/questions/13000698/sub-queries-in-check-constraint可能是有用的 – Kritner

回答

0

您可以創建一個BEFORE INSERT觸發器,這些觸發器可能會導致錯誤,或者在未滿足數據要求時將字段設置爲默認值。

在你的情況,你可以創建一個觸發器,這將引發錯誤,如果驗證失敗,像以下:

CREATE TRIGGER `validate_before_insert` BEFORE INSERT ON `Device` 
FOR EACH ROW 
BEGIN 
    IF EXISTS (SELECT* FROM ReservedName WHERE Name = new.Name) THEN 
     SIGNAL SQLSTATE '12345' 
      SET MESSAGE_TEXT := 'check constraint on Device.Name failed'; 
    END IF; 
END 

您可以在documentation閱讀更多關於MySQL的triggeres。