假设我有一个名为 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然而那里的建议似乎并没有真正起作用。
有什么想法吗?
最佳答案
在 SQL Server 中,默认值定义为与表中特定列关联的约束。所有约束都分配了一个名称;这很重要,因为一旦约束被创建,如果你想修改它,你必须通过这个名字来引用它。 (我会关注这个问题,看看我是不是错了。)
基于这个示例表:
CREATE TABLE MyTable
(
MyTableId int not null
,SomeData varchar(50) not null default 'Foo'
,MoreData datetime not null default CURRENT_TIMESTAMP
)
第 1 步:确定列上是否存在约束。有几种方法可以做到这一点,所有方法都涉及系统 View 和/或元数据功能。这是一个快速的例子,其中“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
关于sql - SQL Server中如何更改列的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9603428/