Mysql 如何检查外键对象是否属于某种类型
这个问题被简化以减少混乱 在我的数据库中有两个表。1表“产品”和1表“通知”。 此产品可以有3种类型,由枚举定义(Mysql 如何检查外键对象是否属于某种类型,mysql,check-constraints,Mysql,Check Constraints,这个问题被简化以减少混乱 在我的数据库中有两个表。1表“产品”和1表“通知”。 此产品可以有3种类型,由枚举定义(enum('SERVER'、'SERVICE'、'APPLICATION')) 通知包含产品的ForeignKey及其ID 当我创建通知时,我想检查给定的ForeignKey是否属于“APPLICATION”类型。我能进行这样的检查吗?如果是,是否通过检查来完成 据我所知,我唯一能检查的是一个值(例如,CHECK(foo>0))如果它是一个枚举,你应该能够检查该值是否等于你想要的结果
enum('SERVER'、'SERVICE'、'APPLICATION')
)
通知包含产品的ForeignKey及其ID
当我创建通知时,我想检查给定的ForeignKey是否属于“APPLICATION”类型。我能进行这样的检查吗?如果是,是否通过检查来完成
据我所知,我唯一能检查的是一个值(例如,CHECK(foo>0)
)如果它是一个枚举,你应该能够检查该值是否等于你想要的结果
加入您的表,然后使用where子句筛选出您不想要的结果。您没有提供表的全部细节,因此我将给出一个简单的示例,说明您想要做什么。我的枚举是“类型”列
以简化形式:
SELECT *
FROM products
WHERE type = 'APPLICATION'
最简单的方法是在插入之前触发,在更新之前触发第二个
您可以对关键字值进行选择
,以在触发器中对其进行测试,并释放错误
请看第二个答案
像这样:
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 ;
分隔符$$
在插入之前创建触发器“test\u before\u insert`before insert ON`test”`
每行
开始
如果字符长度(NEW.ID)<4,则
信号状态“12345”
设置消息_TEXT:=“检查Test.ID上的约束失败”;
如果结束;
完$$
定界符;
这确实是可能的,也是我目前的解决方案,但我想知道是否有可能在数据库本身而不是在INSERT
语句中添加额外的安全级别。您能澄清一下您的意思吗?具体来说,您想做什么?一个非常简单的示例:创建表产品(产品没有整数,名称文本,价格数字检查(价格>0))
在本例中,数据库确保价格始终为>0
我试图实现的是一种相同的检查,其中数据库确保外键始终来自typeAPPLICATION
,目前,这似乎是一个很好的解决方案。如果没有其他答案将被张贴,这将是我的方式去。但是另一个选项,在CREATE表中实现检查或约束,是不可行的选项?这似乎是最好的选择imo@creulcat据我所知,除了使用触发器,没有其他方法可以进行远程约束检查。。。