繁体   English   中英

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

[英]How to change the default value of a column in SQL Server

据说我有一个名为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列上添加约束来添加它,但我不确定这是否是唯一的方法。 我已经看过这篇文章,但建议的内容似乎并没有真正起作用。

有任何想法吗?

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

不过,我不知道为ALTER做一个简单的方法。 在您的情况下,如果该默认约束不在该列上,我会说:

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

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

使用默认约束

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

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

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

ALTER TABLE dbo.Persons DROP CONSTRAINT constraint_name;

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

在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

您可以使用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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM