亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在MySQL表上添加自定義CHECK約束?

如何在MySQL表上添加自定義CHECK約束?

呼啦一陣風 2019-12-27 10:14:10
我在這張桌子上遇到麻煩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中不起作用?
查看完整描述

3 回答

?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

CHECKMySQL不支持約束。您可以定義它們,但是它們什么也不做(從MySQL 5.7開始)。


從手冊:


該CHECK子句已解析,但被所有存儲引擎忽略。


解決方法是創建觸發器,但并不是最容易使用的觸發器。


如果要使用支持CHECK約束的開源RDBMS ,請嘗試PostgreSQL。它實際上是一個非常好的數據庫。


查看完整回答
反對 回復 2019-12-27
?
達令說

TA貢獻1821條經驗 獲得超6個贊

正如我在本文中所解釋的,從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約束的更多詳細信息,請參閱本文。


查看完整回答
反對 回復 2019-12-27
  • 3 回答
  • 0 關注
  • 1957 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號