2011-08-29 66 views
2

如果我有以下關係強制實施企業約束

Articles 
articleId(PK) 
title 
content 
date 

而且說我的企業的約束是:

There may be only 10 articles in this table at anyone time 

什麼是執行上的MySQL這家企業約束的最佳方式數據庫?它純粹是由代碼處理?我是否應該更改數據庫中的任何內容來強制執行此類限制?

回答

1

我會用一個觸發器。

你可以做到這一點,像這樣:

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,這非常方便。

0

我將創建用於插入將被專門用於插入新篇文章的存儲過程。 在那裏,我會檢查你可能有的任何自定義約束。

如果一個自定義的約束被違反,那麼你可以用信號被違反了什麼約束(例如經由迴歸變量)的客戶端,並插入文章跳過。