如何更改SQL Server中列的默认值

时间:2012-03-07 14:37:45

标签: sql database sql-server-2008

据说我有一个名为Person的表,如下所示:

CREATE TABLE Persons
(
    P_Id uniqueidentifier Default newsequentialid() NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255) DEFAULT 'Sandnes'
)

如何使用sql查询删除该列的默认值?此外,如果它不存在,我该如何添加它。 我知道可以通过改变表格并在P_Id列上添加约束来添加它,但我不确定这是否是唯一的方法。我遇到了this article但是建议的内容似乎没有真正起作用。

有什么想法吗?

3 个答案:

答案 0 :(得分:4)

找出已存在的表的语法的最简单方法是在对象资源管理器中右键单击该表,然后选择Script As > Create To > New Window。如果您需要创建一个表,这将有助于您为类似的表生成脚本。

我不知道为ALTER执行此操作的简单方法。在您的情况下,如果该列上没有该默认约束,我会说:

ALTER TABLE dbo.Persons ADD CONSTRAINT dfCity DEFAULT ('Sandnes') FOR City;

这只是因为我已经知道为表添加约束的语法,因为我必须做很多事情。这篇文章有点过时了,但它可能很有用,因为大部分内容仍然具有相关性,并且在新功能方面并没有太多缺失:

Working with Default Constraints

当然还有联机丛书中的ALTER TABLE主题:

http://msdn.microsoft.com/en-us/library/ms190273.aspx

如果要删除约束,首先需要找到名称,然后您可以说:

ALTER TABLE dbo.Persons DROP CONSTRAINT constraint_name;

@Calin发布了一个查询,该查询将获取约束的名称,但我认为您不能将@constraintname传递给ALTER TABLE语句。

答案 1 :(得分:4)

在SQL Server中,默认值定义为与表中特定列关联的约束。为所有约束分配一个名称;这很重要,因为一旦创建了约束,如果要修改它,就必须通过此名称引用它。 (而且我会看到这个问题,看看我是不是错了。)

基于此样本表:

CREATE TABLE MyTable
 (
   MyTableId  int          not null
  ,SomeData   varchar(50)  not null  default 'Foo'
  ,MoreData   datetime     not null  default CURRENT_TIMESTAMP
 )

步骤1:确定列上是否存在约束。有几种方法可以做到这一点,所有这些都涉及系统视图和/或元数据功能这是一个快速的,其中'MyTable'和'SomeData'可以设置为参数:

SELECT name
 from sys.default_constraints
 where parent_object_id = object_id('MyTable')
  and parent_column_id = columnproperty(object_id('MyTable'), 'SomeData', 'ColumnId')

尝试一下,您会发现生成的名称基本上是随机的。要确定列上是否存在默认值,您可以执行以下操作:

IF exists (select name
            from sys.default_constraints
            where parent_object_id = object_id('MyTable')
             and parent_column_id = columnproperty(object_id('MyTable'), 'SomeData', 'ColumnId'))
    PRINT 'Default found'
ELSE
    PRINT 'NoDefault'

要删除不知道名称的现有默认值,您必须构建动态SQL。 (引用文章中的代码是错误的,并且显然从未经过测试。)@Călin的做法与我做的略有不同,但这个想法是一样的:

DECLARE @Command nvarchar(max)

SELECT @Command = 'ALTER TABLE MyTable drop constraint ' + name
 from sys.default_constraints
 where parent_object_id = object_id('MyTable')
  and parent_column_id = columnproperty(object_id('MyTable'), 'SomeData', 'ColumnId')

IF @Command is not null
    EXECUTE sp_executeSQL @Command

(通过错误检查,正在检查表和列的参数,等等。)

最后,您可以通过在创建约束时命名默认值来避免大部分问题,如下所示:

CREATE TABLE MyTable
 (
   MyTableId  int          not null
  ,SomeData   varchar(50)  not null
    constraint DF_MyTable__SomeData  default 'Foo'
  ,MoreData   datetime     not null
    constraint DF_MyTable__MoreData  default CURRENT_TIMESTAMP
 )

或者像这样:

IF not exists (select name
                from sys.default_constraints
                where parent_object_id = object_id('MyTable')
                 and parent_column_id = columnproperty(object_id('MyTable'), 'SomeData', 'ColumnId'))
    ALTER TABLE MyTable
     add constraint DF_MyTable__SomeData
      default 'Foo' for SomeData

答案 2 :(得分:0)

您可以使用sys.default_constraints上的查询获取默认约束的名称,然后通过更改表格来删除它:

declare @constraintname varchar(128);
select @constraintname = d.name
from sys.default_constraints d
join sys.columns c ON c.column_id = d.parent_column_id AND c.object_id = d.parent_object_id
join sys.objects o ON o.object_id = d.parent_object_id
WHERE o.name = 'Persons' AND c.name = 'P_Id';

declare @sql nvarchar(256);
set @sql = 'ALTER TABLE Persons DROP CONSTRAINT ' + @constraintName;
EXEC sp_executesql @sql;