Sql 如何检查默认值约束是否存在?
我正在使用SQLServer2008。我需要找到默认值约束是否不存在,然后创建它。这是我试过的Sql 如何检查默认值约束是否存在?,sql,sql-server-2008,Sql,Sql Server 2008,我正在使用SQLServer2008。我需要找到默认值约束是否不存在,然后创建它。这是我试过的 IF (NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_NAME ='MyConstraint')) BEGIN ALTER TABLE [XX] ADD CONSTRAINT [MyConstraint] DEFAULT ((-1)) FOR [XXXX] END G
IF (NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_NAME ='MyConstraint'))
BEGIN
ALTER TABLE [XX] ADD CONSTRAINT [MyConstraint] DEFAULT ((-1)) FOR [XXXX]
END
GO
我发现这更容易:
IF OBJECT_ID('SchemaName.MyConstraint', 'D') IS NULL
BEGIN
-- create it here
END
以下内容在SQL Server 2016上适用于我 假设我有一个名为MY_table的表和一个名为MY_COLIUMN的列。 我想在需要添加约束的列表上添加约束(默认为“-1”)
/* Test for the specific column */
IF EXISTS (select 1 from sys.all_columns c where c.object_id= OBJECT_ID(N'MY_TABLE') and c.name='MY_COLIUMN')
BEGIN
/* Add default if not exits */
IF NOT EXISTS (
select 1 from sys.default_constraints c where c.object_id =
(
select default_object_id from sys.all_columns c where c.object_id = OBJECT_ID(N'MY_TABLE') and c.name='MY_COLIUMN'
)
)
BEGIN
ALTER TABLE MY_TABLE
ADD DEFAULT '-1' FOR MY_COLIUMN;
END
END
GO
我过去使用过以下方法:
DECLARE @default sysname
SELECT @default = object_name( cdefault ) FROM syscolumns WHERE id = object_id( 'DBO.TABLE' ) AND name = 'COLUMN'
IF ( not @default is null )
BEGIN
...
END
我有点困惑,为什么这个简单的任务如此复杂。在我的例子中,我没有约束名称——只有表名和列名。在尝试添加默认值之前,我想检查它们是否已经有默认值 在进一步挖掘之后,我得出了以下结论:
IF (SELECT Column_Default FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'MY_TABLE' AND COLUMN_NAME = 'MY_COLUMN') is NULL
BEGIN
ALTER TABLE [dbo].[MY_TABLE]
ADD DEFAULT ('') FOR [MY_COLUMN]
END
GO
我必须在一个巨大的样板脚本中实现它,所以越短越好 搜索存储数据库默认costraints的系统表,不带架构名称:
IF EXISTS(SELECT 1 FROM sys.default_constraints WHERE [name] = 'MyConstraint')
print 'Costraint exists!';
ELSE
print 'Costraint doesn''t exist!';
我知道我来晚了,但我是OBJECTPROPERTY的忠实粉丝。下面是如何在默认值不存在的情况下将列的默认值设置为1
IF (OBJECTPROPERTY(OBJECT_ID('My_constraint_name'),'CnstIsColumn') IS NULL
ALTER TABLE Mytable ADD CONSTRAINT [MY_constraint_name] DEFAULT ((1)) FOR [My_column_name]
从SQL Server 2005开始,建议使用
sys
schema-sys.columns
,sys.tables
-中的目录视图,而不是sysobjects
等。这些视图将从SQL的未来版本中删除Server@marc_s我更改了密码,但是sysobjects
etc兼容性视图还将存在很长一段时间,至少在SQL Server的下一个版本之后。下一版本的SQL Server支持以下SQL Server数据库引擎功能,但将在更高版本中删除。尚未确定SQL Server的特定版本@RichardTheKiwi-您的链接的第三句话是“不推荐的功能不应用于新的应用程序”。非常棒!谢谢请添加一些解释,避免只回答代码谢谢您的代码片段,它可能提供一些有限的短期帮助。通过说明为什么这是一个很好的问题解决方案来正确解释它的长期价值,并将使它对未来有其他类似问题的读者更有用。请您的回答添加一些解释,包括您所做的假设。如果您搜索包含模式的对象,这实际上不起作用。即使您认为我的默认约束肯定存在,OBJECT\u ID
为其返回空值。如果用户没有查看该对象的权限,则可能不起作用。我也没有列默认值的名称,因此这种方法对我有效。
IF EXISTS(SELECT 1 FROM sys.default_constraints WHERE [name] = 'MyConstraint')
print 'Costraint exists!';
ELSE
print 'Costraint doesn''t exist!';
IF (OBJECTPROPERTY(OBJECT_ID('My_constraint_name'),'CnstIsColumn') IS NULL
ALTER TABLE Mytable ADD CONSTRAINT [MY_constraint_name] DEFAULT ((1)) FOR [My_column_name]