3 回答

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

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超6個(gè)贊
正如我在本文中所解釋的,從8.0.16版本開(kāi)始,MySQL添加了對(duì)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觸發(fā)器時(shí)才可用:
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;
有關(guān)使用8.0.16之前的MySQL版本的數(shù)據(jù)庫(kù)觸發(fā)器模擬CHECK約束的更多詳細(xì)信息,請(qǐng)參閱本文。
添加回答
舉報(bào)