这张table我有点问题
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中不起作用吗?
5条答案
按热度按时间6jjcrrmo1#
我不明白为什么这里没有人提到带check选项的视图可以作为mysql中check约束的一个很好的替代方案:
mysql站点上有一个doc:view with check option子句
p、 请记住,您的视图应该是可更新的!请参阅mysql可更新视图(感谢romeo sierra在评论中的澄清)。
pbpqsu0x2#
除了触发器之外,对于简单的约束,如您拥有的约束:
你需要一个
Foreign Key
从status
参照表(ParticipantStatus
有3行:'a','d','u'
):ymdaylpp3#
CHECK
mysql不支持约束。您可以定义它们,但它们什么也不做(从mysql 5.7开始)。根据手册:
这个
CHECK
子句已解析,但被所有存储引擎忽略。解决方法是创建触发器,但它们不是最容易使用的。
如果您想要一个支持
CHECK
约束,请尝试postgresql。它实际上是一个非常好的数据库。neskvpey4#
正如我在本文中所解释的,从版本8.0.16开始,mysql增加了对检查约束的支持:
以前,这仅在使用插入前和更新前触发器时可用:
有关在8.0.16之前的mysql版本中使用数据库触发器模拟检查约束的更多详细信息,请参阅本文。
brvekthn5#
以下是一种快速方便地获得所需支票的方法: