3 回答

TA貢獻1828條經驗 獲得超3個贊
CHECKMySQL不支持約束。您可以定義它們,但是它們什么也不做(從MySQL 5.7開始)。
從手冊:
該CHECK子句已解析,但被所有存儲引擎忽略。
解決方法是創建觸發器,但并不是最容易使用的觸發器。
如果要使用支持CHECK約束的開源RDBMS ,請嘗試PostgreSQL。它實際上是一個非常好的數據庫。

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約束的更多詳細信息,請參閱本文。
添加回答
舉報