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

Sco*_*iAS 2 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'
)
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

Aar*_*and 5

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

不过,我不知道有什么简单的方法可以做到这一点ALTER。在你的情况下,如果默认约束不在该列上,我会说:

ALTER TABLE dbo.Persons ADD CONSTRAINT dfCity DEFAULT ('Sandnes') FOR City;
Run Code Online (Sandbox Code Playgroud)

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

使用默认约束

当然还有ALTER TABLE在线图书中的主题:

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

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

ALTER TABLE dbo.Persons DROP CONSTRAINT constraint_name;
Run Code Online (Sandbox Code Playgroud)

@Calin 发布了一个查询,该查询将获取约束的名称,但我认为您不能以这种方式传递@constraintnameALTER TABLE语句。


Phi*_*ley 5

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

基于此示例表:

CREATE TABLE MyTable
 (
   MyTableId  int          not null
  ,SomeData   varchar(50)  not null  default 'Foo'
  ,MoreData   datetime     not null  default CURRENT_TIMESTAMP
 )
Run Code Online (Sandbox Code Playgroud)

步骤 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')
Run Code Online (Sandbox Code Playgroud)

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

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'
Run Code Online (Sandbox Code Playgroud)

要删除您不知道名称的现有默认值,您必须构建动态 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
Run Code Online (Sandbox Code Playgroud)

(带有错误检查、正在检查的表和列的参数等。)

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

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
 )
Run Code Online (Sandbox Code Playgroud)

或者像这样:

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
Run Code Online (Sandbox Code Playgroud)