2011-06-15 119 views
2

我有以下查詢是添加約束。 但爲了添加,我想檢查這個鍵是否已被使用或不?SQL添加外鍵約束與檢查

ALTER TABLE HL7_MessageHierarchy 
ADD CONSTRAINT fk_vMessageType FOREIGN KEY (vMessageType) 
     REFERENCES HL7_MessageType(vMessageType); 

例如。如果我必須添加一列,我可以輕鬆地檢查該表是否存在於sysobjects中,並且其各列存在於syscolumns中。

是否有可能多次使用查詢而沒有GO,也沒有確實發生任何錯誤?如果是的話那怎麼樣?

[編輯]

我不知道爲什麼我的瀏覽器不允許我添加註釋,所以我增加了編輯。

我想檢查是否存在任何具有相同名稱的外鍵。所以如果即使沒有數據,查詢也會出問題,因爲密鑰可能已經存在。我想運行上面的腳本乾淨(當然居民數據確實很重要,但這也許是一個簡單的檢查?) [編輯]

我的不好,我一定知道該版本是重要的...我相信它的2005年......(會喜歡知道是否有人能告訴其他版本太)

回答

2

使用WITH CHECK SQL 2005中,檢查對象的存在的推薦方法是Catalog Views。你想要的是sys.foreign_keys

IF NOT EXISTS (SELECT * FROM sys.foreign_keys 
       WHERE name = 'fk_vMessageType') 
BEGIN 
    EXEC (' 
    ALTER TABLE HL7_MessageHierarchy 
    ADD CONSTRAINT fk_vMessageType FOREIGN KEY (vMessageType) 
      REFERENCES HL7_MessageType(vMessageType) 
    ') 
END 

我已經包裹創作EXEC避免混淆解析器。

+0

其實我在我的工作地點有一些問題 - 不能接受爲有用的答案。謝謝。我需要這樣的東西。 – Umer 2011-07-01 12:28:38

3

我假定你的意思

檢查值HL7_MessageHierarchy不inHL7_MessageType」

所以,查詢升IKE在此會告訴你

SELECT * 
FROM HL7_MessageHierarchy H 
WHERE NOT EXISTS (SELECT * 
     FROM HL7_MessageType T 
     WHERE H.vMessageType = T.vMessageType) 

另外,我建議你太

ALTER TABLE HL7_MessageHierarchy WITH CHECK ADD 
CONSTRAINT fk_vMessageType FOREIGN KEY (vMessageType) 
     REFERENCES HL7_MessageType(vMessageType); 
+0

謝謝,雖然它非常重要的檢查,但@AakashM得到了我的問題... – Umer 2011-07-01 12:30:40