2013-08-28 36 views
1

我有兩個表:約束非ID在國外表

EMAIL_QUEUE 
    ID identity, 
    MIME_TYPE_ID int foreign key MIME_TYPE(id) 
    etc... 

MIME_TYPE 
    ID identity, 
    MIME_TYPE varchar(300), 
    etc... 

MIME_TYPEs目前尚未宣佈獨特。我想在我的EMAIL_QUEUE表上設置一個約束,以便它只接受某些MIME類型(text/plain和text/html)。這樣做的最佳做法是什麼?

  1. 使用自定義功能和檢查約束
  2. 充分利用MIME_TYPE列MIME_TYPE表的主鍵,把一個約束的可能值

回答

1

添加檢查約束。例如,如果在兩個期望的MIME類型的ID是3和4:

ALTER TABLE EMAIL_QUEUE WITH CHECK 
    ADD CONSTRAINT MIME_TYPE_CHECK CHECK (MIME_TYPE_ID IN (3,4)) 

ID值不應該改變,所以它的行進行硬編碼是可接受的值。

+0

好解決,但隨後如果ID是在不同的環境不同會發生什麼?我必須爲每個環境編寫不同的腳本。不幸的是,我不能保證text/plain的ID在每個環境中都是相同的(dev,qa,staging,prod) –

+0

檢查約束無法查找其他表。使用源代碼控制的腳本來填充使用硬編碼(不是自動遞增的)鍵/值的「查找」表是一種很好的做法,因此您描述的問題類型不存在,這種解決方案將適用於您。表格的內容應隨每個代碼版本一起發佈。谷歌的「liquibase」就是一個很好的工具示例,可能對您有所幫助。 – Bohemian

0

這也可以用一個附加表

-- this table is unchanged 
MIME_TYPE 
    ID identity, 
    MIME_TYPE varchar(300), 
    etc... 

-- additional table, which should contain ids of the 'text/plain' and 'text/html' 
EMAIL_QUEUE_MIME_TYPE 
    ID int -- PK and FK to MIME_TYPE(id) 

-- in this table MIME_TYPE_ID should be redirected to new table 
EMAIL_QUEUE 
    ID identity, 
    MIME_TYPE_ID int foreign key EMAIL_QUEUE_MIME_TYPE(id) 
    etc...