2016-02-09 21 views
1

該問題被簡化以減少混亂。如何檢查外鍵對象是否屬於某種類型

在我的數據庫中有2個表格。 1個「產品」表和1個「通知」表。 此產品可以是3種類型,由枚舉(ENUM('SERVER', 'SERVICE', 'APPLICATION'))定義。

通知包含產品的外鍵,其ID。

當我創建通知時,我想檢查給定的ForeignKey是否爲'APPLICATION'類型。我能進行這樣的檢查嗎?如果是這樣,這是由CHECK完成?

據我知道,我可以檢查的唯一事情是一個值(例如CHECK(foo > 0)

回答

1

這最簡單的事情做的是一個觸發Before Insert,第二個Before Update

您可以將您的外國人鍵值SELECT在觸發器中進行測試,併發布錯誤。

CHECK constraint in MySQL is not working

像這樣第2個答案請看:

DELIMITER $$ 
CREATE TRIGGER `test_before_insert` BEFORE INSERT ON `Test` 
FOR EACH ROW 
BEGIN 
    IF CHAR_LENGTH(NEW.ID) < 4 THEN 
     SIGNAL SQLSTATE '12345' 
      SET MESSAGE_TEXT := 'check constraint on Test.ID failed'; 
    END IF; 
END$$ 
DELIMITER ; 
+0

現在,這似乎是一個很好的解決方案。如果沒有其他答案會發布,這將是我的路要走。 但是,在CREATE TABLE中實現CHECK或CONSTRAINT的另一種選擇是不可行的選擇? – creulcat

+0

這似乎是你最好的選擇imo – Anton

+1

@creulcat就我所知的MySql而言,沒有其他辦法可以做遠距離約束檢查而不是觸發器... – Blag

0

如果一個枚舉,你應該能夠檢查值等於你想要的結果。

加入您的表格,然後使用where子句過濾出您不想要的結果。你沒有提供你桌子的全部細節,所以我將舉一個你想要做什麼的簡單例子。我的枚舉是「類型」列。

的簡化形式:

  SELECT * 
      FROM products 
      WHERE type = 'APPLICATION' 
+0

這的確是可能的,是我目前的解決方案,但我不知道是否有可能增加爲數據庫本身提供了一個額外的安全級別,而不是在INSERT語句中。 – creulcat

+0

你能澄清你的意思嗎?具體來說,你想要做什麼? – Anton

+0

一個很簡單的例子: 'CREATE TABLE產品( product_no整數, 名文字, 價格數字CHECK(價格> 0) );' 在這個例子中,該數據庫可以確保價格始終是'> 0' 我試圖實現的是一種相同的檢查,其中數據庫確保外鍵總是從類型'應用程序' – creulcat

相關問題