SQL添加带键的外键约束

时间:2011-06-15 12:32:29

标签: sql sql-server

我有以下查询添加禁令。 但是为了添加,我想检查这个密钥是否已被使用?

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

。如果我必须添加一列,我可以很容易地检查该表是否存在于sysobjects中,并且它的相应列是否存在于syscolumns中。

是否可以在没有GO的情况下多次使用查询并且确实没有出现任何错误?如果是,那么如何???

[编辑]

我不知道为什么我的浏览器不允许我添加评论,所以我要添加到编辑。

我想检查是否存在任何具有相同名称的外键。因此,如果没有数据,那么查询可能会产生问题,因为密钥可能已经存在。我想运行上面的脚本干净(当然常驻数据确实很重要,但这可能是一个直接的检查?) [编辑]

我的坏,我一定知道这个版本很重要......我相信它的2005年...(很想知道是否有人可以告诉其他版本)

2 个答案:

答案 0 :(得分:3)

我认为你的意思是

  

检查HL7_MessageHierarchy中的值不是inHL7_MessageType“

所以,这样的查询会告诉你

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

另外,我建议使用WITH CHECK

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

答案 1 :(得分:2)

在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中,以避免混淆解析器。