Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何检查外键对象是否属于某种类型_Mysql_Check Constraints - Fatal编程技术网

Mysql 如何检查外键对象是否属于某种类型

Mysql 如何检查外键对象是否属于某种类型,mysql,check-constraints,Mysql,Check Constraints,这个问题被简化以减少混乱 在我的数据库中有两个表。1表“产品”和1表“通知”。 此产品可以有3种类型,由枚举定义(enum('SERVER'、'SERVICE'、'APPLICATION')) 通知包含产品的ForeignKey及其ID 当我创建通知时,我想检查给定的ForeignKey是否属于“APPLICATION”类型。我能进行这样的检查吗?如果是,是否通过检查来完成 据我所知,我唯一能检查的是一个值(例如,CHECK(foo>0))如果它是一个枚举,你应该能够检查该值是否等于你想要的结果

这个问题被简化以减少混乱

在我的数据库中有两个表。1表“产品”和1表“通知”。 此产品可以有3种类型,由枚举定义(
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
我试图实现的是一种相同的检查,其中数据库确保外键始终来自type
APPLICATION
,目前,这似乎是一个很好的解决方案。如果没有其他答案将被张贴,这将是我的方式去。但是另一个选项,在CREATE表中实现检查或约束,是不可行的选项?这似乎是最好的选择imo@creulcat据我所知,除了使用触发器,没有其他方法可以进行远程约束检查。。。