如果我有以下關係強制實施企業約束
Articles
articleId(PK)
title
content
date
而且說我的企業的約束是:
There may be only 10 articles in this table at anyone time
什麼是執行上的MySQL這家企業約束的最佳方式數據庫?它純粹是由代碼處理?我是否應該更改數據庫中的任何內容來強制執行此類限制?
如果我有以下關係強制實施企業約束
Articles
articleId(PK)
title
content
date
而且說我的企業的約束是:
There may be only 10 articles in this table at anyone time
什麼是執行上的MySQL這家企業約束的最佳方式數據庫?它純粹是由代碼處理?我是否應該更改數據庫中的任何內容來強制執行此類限制?
我會用一個觸發器。
你可以做到這一點,像這樣:
DELIMITER $$
CREATE TRIGGER bi_articles_each BEFORE INSERT ON articles FOR EACH ROW
BEGIN
DECLARE number_of_articles INTEGER;
SELECT count(*) INTO number_of_articles FROM articles;
IF number_of_articles > 10 THEN
//select from a non_existing query to force an error and prevent the insert
SELECT error
FROM `There may be only 10 articles in the article table at anyone time`;
END IF;
END $$
DELIMITER ;
參見:
http://dev.mysql.com/doc/refman/5.0/en/triggers.html
http://www.databasedesign-resource.com/mysql-triggers.html
錯誤產生是一個有點笨重,但除此之外,它就像一個魅力。我用它所有的時間。
關於觸發器的好處在於,無論您使用的插入向量如何,它都可以保證正常工作,並且它允許您保留(使用)用於插入,刪除和更新的標準SQL,這非常方便。
我將創建用於插入將被專門用於插入新篇文章的存儲過程。 在那裏,我會檢查你可能有的任何自定義約束。
如果一個自定義的約束被違反,那麼你可以用信號被違反了什麼約束(例如經由迴歸變量)的客戶端,並插入文章跳過。