当前位置: 首页 > 面试题库 >

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

庞鸿骞
2023-03-14
问题内容

我在这张桌子上遇到麻烦

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”。我无法将字段设置为Enumset

谁能告诉我为什么这段代码在MySQL中不起作用?


问题答案:

正如我在本文中所解释的,从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约束的更多详细信息,请参阅本文。



 类似资料:
  • 我有一本书。我想用作表情的png图像。有没有办法将此映像作为emote添加到服务器?我认为这应该在Guildjoin事件中完成。 谢谢你的回答!

  • 因为我想在设置compress:true时替换此方法 为什么我要换掉这个?因为我想弄清楚高速缓存大小是否是在高并发(apache jmeter:50个用户,6个循环,ramup 20)情况下减慢从POI-SXSSF-sheet???.gz到POI-SXSSF-template???.xlsx的写入速度的主要原因。但问题是在初始化SXSSFWorkbook时如何使用我自己的SheetDataWrit

  • 是否有一个时间格式来指定这样的日期序列到轴在D3和v4?

  • Thymeleaf有许多有用的实用程序,如或。我试图添加一个自定义的,但不知道如何注册这一点。

  • 问题内容: 我想向我的Web应用程序添加一个自定义的右键单击菜单。无需使用任何预建的库就可以做到吗?如果是这样,如何显示一个不使用第三方JavaScript库的简单自定义右键单击菜单? 我的目标是像Google文档那样。它允许用户右键单击并向用户显示他们自己的菜单。 注意: 我想学习如何制作自己的东西,而不是使用大多数人以来已经制作的东西,那些第三方库充斥着功能,而我只想要我需要的功能,因此我希望

  • 在中有一个方法,但它看起来不像是一个公共API,所以我宁愿不使用它。创建自定义指令并使用看起来是另一种选择,但基本上需要为每个自定义验证规则创建一个指令,而我不希望这样做。 实际上,在最简单的场景中,将控制器中的某个字段标记为无效(同时保持同步)可能是我完成任务所需要的,但我不知道如何做到这一点。