正如我在本文中所解释的,从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 THENsignal 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 THENsignal 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 THENsignal 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 THENsignal sqlstate '45000'set message_text = 'Announcement validUntil cannot be NULL'; END IF; END IF;END;
有关使用8.0.16之前的MySQL版本的数据库触发器模拟CHECK约束的更多详细信息,请参阅本文。



