sql-server - SQL Server : How do I add a constraint to an existing table but only if the constraint does not already exist?

标签 sql-server sql-server-2005

我需要向现有 SQL Server 表添加约束,但前提是该表尚不存在。

我使用以下 SQL 创建约束。

ALTER TABLE [Foo] ADD CONSTRAINT [FK_Foo_Bar] FOREIGN KEY ([BarId]) REFERENCES [Bar] ([BarId]) ON UPDATE CASCADE ON DELETE CASCADE

我希望可以在 SQL 的开头添加一些 SQL 来测试约束是否存在,但我不知道如何添加。

最佳答案

就我个人而言,我会放弃现有的约束,然后重新创建它 - 以防已有的约束在某种程度上有所不同

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[MyFKName]') AND OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    ALTER TABLE dbo.MyTableName DROP CONSTRAINT MyFKName
GO
ALTER TABLE dbo.MyTableName ADD CONSTRAINT [MyFKName] ...

我当前使用的更现代的代码是:

IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[MyFKName]') AND parent_object_id = OBJECT_ID(N'[dbo].[MyTableName]'))
    ALTER TABLE dbo.[MyTableName] DROP CONSTRAINT [MyFKName]
GO
ALTER TABLE dbo.[MyTableName] ADD CONSTRAINT [MyFKName] FOREIGN KEY ...

不确定检查 sys.objects ...或 sys.foreign_keys ...是否有任何优势...但在某些时候我决定使用 sys.foreign_keys

从 SQL2016 开始,添加了新的“IF EXISTS”语法,该语法更具可读性:

-- For SQL2016 onwards:
ALTER TABLE dbo.[MyTableName] DROP CONSTRAINT IF EXISTS [MyFKName]
GO
ALTER TABLE dbo.[MyTableName] ADD CONSTRAINT [MyFKName] FOREIGN KEY ...

关于sql-server - SQL Server : How do I add a constraint to an existing table but only if the constraint does not already exist?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/547074/

相关文章:

sql-server-2005 - 多父树(或有向图)实现sql server 2005

sql - 单个 SQL 查询一次性更新表中所有列的数据类型

sql - 没有行但(XLOCK,ROWLOCK)锁定它?

sql-server-2005 - 检测是否安装了 SQL Server Compact Edition 3.5 SP2 x64?

sql - SQL Server 2005 的首选合并方法是什么?

sql-server - HTML5 离线数据存储选项

sql - 如何检查外键是否存在?

sql - 如何从上面的行中选择信息?

sql - 将确切的一行移到所有行的顶部,留下所有其他的 ASCENDING

c# - 我应该如何从 WCF 服务解决方案访问 SQL Server?