我用这张桌子有点问题

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
);

以前,这只能使用插入前和更新前触发器:

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;

Database相关问答推荐

在GridDB中使用存储过程失败

将数据库/后端添加到 android 应用程序

MongoDB是面向对象的吗?

查询最后一天、上周、上个月SQLite

Postgres - 如何返回缺失数据计数为 0 的行?

外键可以作为主键吗?

无法在 MYSQL 5.5 w/MYSQL Workbench 中更改模式名称

保存图像:文件还是 blob?

Uniqueidentifier vs. IDENTITY vs. Material Code - 主键的最佳 Select 是哪个?

如何在 MySQL 中强制执行唯一约束?

我应该如何使用 MySQL 构建我的设置表?

在数据库中使用数组是不好的设计吗?

EF4 代码优先导致 InvalidOperationException

哪个更重要?数据库设计或编码?

如何在 SQL Server 中生成并手动插入唯一标识符?

Django + PostgreSQL:如何重置主键?

Codeigniter - 使用多个数据库

使用 liquibase 更新表中的一行

如何从多个表中 Select 不同的值

为什么 Rails 迁移在应用程序中定义外键而不在数据库中定义外键?