当前位置:  开发笔记 > 编程语言 > 正文

SQL Server:如何向现有表添加约束,但仅限于约束尚不存在?

如何解决《SQLServer:如何向现有表添加约束,但仅限于约束尚不存在?》经验,为你挑选了2个好方法。

我需要向现有SQL服务器表添加约束,但仅限于它尚不存在.

我正在使用以下SQL创建约束.

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

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



1> Kristen..:

就个人而言,我会删除现有的约束,并重新创建它 - 如果已经存在的约束在某种程度上不同

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 ...


dbo.sysobjects将在以后的版本中删除.对于SQL 2005及以上,请改用sys.objects.

2> Bob King..:

我建议使用INFORMATION_SCHEMA.TABLE_CONSTRAINTS视图.它可以跨不同的数据库引擎移植:

SELECT COUNT(*) 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE TABLE_NAME='Foo' 
AND CONSTRAINT_NAME='FK_Foo_Bar' 
AND CONSTRAINT_TYPE='FOREIGN KEY'

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有