Mat*_*Bak 32 mysql sql database constraints check-constraints
我在这张桌子上遇到了麻烦
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))
);
Run Code Online (Sandbox Code Playgroud)
我希望有一个外键约束,这是有效的.然后我想为属性添加一个约束,status
这样它只能取值'a','d'和'u'.我不可能将字段设置为Enum
或set
.
任何人都可以告诉我为什么这段代码在MySQL中不起作用?
Nul*_*ion 72
CHECK
MySQL不支持约束.您可以定义它们,但它们什么都不做(从MySQL 5.7开始).
从手册:
该
CHECK
子句被解析但被所有存储引擎忽略.
解决方法是创建触发器,但它们不是最容易使用的.
如果你想要一个支持CHECK
约束的开源RDBMS ,试试PostgreSQL.它实际上是一个非常好的数据库.
guz*_*off 18
我不明白为什么没有人提到VIEW WITH CHECK OPTION可以替代MySQL中的CHECK CONSTRAINT:
CREATE VIEW name_of_view AS SELECT * FROM your_table
WHERE <condition> WITH [LOCAL | CASCADED] CHECK OPTION;
Run Code Online (Sandbox Code Playgroud)
MySQL站点上有一个doc:View WITH CHECK OPTION子句
DROP TABLE `Participants`;
CREATE TABLE `Participants` (
`meetid` int(11) NOT NULL,
`pid` varchar(15) NOT NULL,
`status` char(1) DEFAULT NULL check (status IN ('a','d','u')),
PRIMARY KEY (`meetid`,`pid`)
);
-- should work
INSERT INTO `Participants` VALUES (1,1,'a');
-- should fail but doesn't because table check is not implemented in MySQL
INSERT INTO `Participants` VALUES (2,1,'x');
DROP VIEW vParticipants;
CREATE VIEW vParticipants AS
SELECT * FROM Participants WHERE status IN ('a','d','u')
WITH CHECK OPTION;
-- should work
INSERT INTO vParticipants VALUES (3,1,'a');
-- will fail because view uses a WITH CHECK OPTION
INSERT INTO vParticipants VALUES (4,1,'x');
Run Code Online (Sandbox Code Playgroud)
PS:请记住,您的视图应该是可更新的!请参阅MySQL可更新视图 (感谢Romeo Sierra在评论中的澄清).
ype*_*eᵀᴹ 15
除了触发器之外,还有简单的约束,例如你所拥有的约束:
CONSTRAINT `participants_ibfk_2`
CHECK status IN ('a','d','u')
Run Code Online (Sandbox Code Playgroud)
你可以使用Foreign Key
from status
到一个Reference表(ParticipantStatus
有3行:) 'a','d','u'
:
CONSTRAINT ParticipantStatus_Participant_fk
FOREIGN KEY (status)
REFERENCES ParticipantStatus(status)
Run Code Online (Sandbox Code Playgroud)
Vla*_*cea 10
从 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
);
Run Code Online (Sandbox Code Playgroud)
以前,这只能使用 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;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
47888 次 |
最近记录: |