2016-02-09 92 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

相关问题