2011-06-15 117 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