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

我在这张桌子上遇到麻烦


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中不起作用?


呼啦一阵风
浏览 1813回答 3
3回答

子衿沉夜

CHECKMySQL不支持约束。您可以定义它们,但是它们什么也不做(从MySQL 5.7开始)。从手册:该CHECK子句已解析,但被所有存储引擎忽略。解决方法是创建触发器,但并不是最容易使用的触发器。如果要使用支持CHECK约束的开源RDBMS ,请尝试PostgreSQL。它实际上是一个非常好的数据库。

达令说

正如我在本文中所解释的,从8.0.16版本开始,MySQL添加了对CHECK约束的支持:ALTER TABLE topicADD CONSTRAINT post_content_checkCHECK (    CASE        WHEN DTYPE = 'Post'        THEN            CASE                WHEN content IS NOT NULL                THEN 1                ELSE 0            END        ELSE 1    END = 1);ALTER TABLE topicADD CONSTRAINT announcement_validUntil_checkCHECK (    CASE        WHEN DTYPE = 'Announcement'        THEN            CASE                WHEN validUntil IS NOT NULL                THEN 1                ELSE 0            END        ELSE 1    END = 1);以前,仅在使用BEFORE INSERT和BEFORE UPDATE触发器时才可用:CREATETRIGGER post_content_check BEFORE INSERTON topicFOR EACH ROWBEGIN   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;CREATETRIGGER post_content_update_check BEFORE UPDATEON topicFOR EACH ROWBEGIN   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;CREATETRIGGER announcement_validUntil_check BEFORE INSERTON topicFOR EACH ROWBEGIN   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;CREATETRIGGER announcement_validUntil_update_check BEFORE UPDATEON topicFOR EACH ROWBEGIN   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约束的更多详细信息,请参阅本文。
打开App,查看更多内容
随时随地看视频慕课网APP