为了账号安全,请及时绑定邮箱和手机立即绑定

如何在MySQL表上添加自定义CHECK约束?

如何在MySQL表上添加自定义CHECK约束?

呼啦一阵风 2019-12-27 10:14:10
我在这张桌子上遇到麻烦CREATE TABLE `Participants` (  `meetid` int(11) NOT NULL,  `pid` varchar(15) NOT NULL,  `status` char(1) DEFAULT NULL,  PRIMARY KEY (`meetid`,`pid`),  CONSTRAINT `participants_ibfk_1` FOREIGN KEY (`meetid`) REFERENCES `Meetings` (`meetid`) ON DELETE CASCADE  CONSTRAINT `participants_ibfk_2` CHECK (status IN ('a','d','u'))  CONSTRAINT `participants_ibfk_3` CHECK (pid IN (SELECT name FROM Rooms) OR pid IN (SELECT userid FROM People)));我想要一个外键约束,并且可以。然后,我还想向该属性添加一个约束,status以便它只能采用值“ a”,“ d”和“ u”。我无法将字段设置为Enum或set。谁能告诉我为什么这段代码在MySQL中不起作用?
查看完整描述

3 回答

?
子衿沉夜

TA贡献1828条经验 获得超3个赞

CHECKMySQL不支持约束。您可以定义它们,但是它们什么也不做(从MySQL 5.7开始)。


从手册:


该CHECK子句已解析,但被所有存储引擎忽略。


解决方法是创建触发器,但并不是最容易使用的触发器。


如果要使用支持CHECK约束的开源RDBMS ,请尝试PostgreSQL。它实际上是一个非常好的数据库。


查看完整回答
反对 回复 2019-12-27
?
达令说

TA贡献1821条经验 获得超6个赞

正如我在本文中所解释的,从8.0.16版本开始,MySQL添加了对CHECK约束的支持:


ALTER TABLE topic

ADD CONSTRAINT post_content_check

CHECK (

    CASE

        WHEN DTYPE = 'Post'

        THEN

            CASE

                WHEN content IS NOT NULL

                THEN 1

                ELSE 0

            END

        ELSE 1

    END = 1

);


ALTER TABLE topic

ADD CONSTRAINT announcement_validUntil_check

CHECK (

    CASE

        WHEN DTYPE = 'Announcement'

        THEN

            CASE

                WHEN validUntil IS NOT NULL

                THEN 1

                ELSE 0

            END

        ELSE 1

    END = 1

);

以前,仅在使用BEFORE INSERT和BEFORE UPDATE触发器时才可用:


CREATE

TRIGGER post_content_check BEFORE INSERT

ON topic

FOR EACH ROW

BEGIN

   IF NEW.DTYPE = 'Post'

   THEN

       IF NEW.content IS NULL

       THEN

           signal sqlstate '45000'

           set message_text = 'Post content cannot be NULL';

       END IF;

   END IF;

END;


CREATE

TRIGGER post_content_update_check BEFORE UPDATE

ON topic

FOR EACH ROW

BEGIN

   IF NEW.DTYPE = 'Post'

   THEN

       IF NEW.content IS NULL

       THEN

           signal sqlstate '45000'

           set message_text = 'Post content cannot be NULL';

       END IF;

   END IF;

END;


CREATE

TRIGGER announcement_validUntil_check BEFORE INSERT

ON topic

FOR EACH ROW

BEGIN

   IF NEW.DTYPE = 'Announcement'

   THEN

       IF NEW.validUntil IS NULL

       THEN

           signal sqlstate '45000'

           set message_text = 'Announcement validUntil cannot be NULL';

       END IF;

   END IF;

END;


CREATE

TRIGGER announcement_validUntil_update_check BEFORE UPDATE

ON topic

FOR EACH ROW

BEGIN

   IF NEW.DTYPE = 'Announcement'

   THEN

       IF NEW.validUntil IS NULL

       THEN

           signal sqlstate '45000'

           set message_text = 'Announcement validUntil cannot be NULL';

       END IF;

   END IF;

END;

有关使用8.0.16之前的MySQL版本的数据库触发器模拟CHECK约束的更多详细信息,请参阅本文。


查看完整回答
反对 回复 2019-12-27
  • 3 回答
  • 0 关注
  • 1867 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信