修改SQL Server中的默认值

Rub*_*ton 37 sql sql-server

我正在尝试使用SQL Server 2008中的SQL语句更改列的默认值.我在很多地方发现如何在创建表/添加列时设置默认值但不是如何设置它/列已存在后修改它.

这是我可以用来设置它添加:

ALTER TABLE MyTable ADD MyColumn int NOT NULL DEFAULT 0
Run Code Online (Sandbox Code Playgroud)

这有效,但如果我稍后尝试修改它:

ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL DEFAULT -1
ALTER TABLE MyTable ALTER COLUMN MyColumn int NOT NULL SET DEFAULT -1
Run Code Online (Sandbox Code Playgroud)

这些都不是语法正确的,我找不到我假装在任何地方的语法.我唯一的选择是添加一个新列,复制前一列的值,然后删除上一列和新列以进行更改,但这对我来说似乎不对.

有没有办法只用一个简单的句子做我想做的事情?

谢谢.

Ada*_*ski 63

添加具有默认值的列时,会发生以下情况:创建了默认约束:

create table _temp 
( x int default 1)
Run Code Online (Sandbox Code Playgroud)

sp_help 结果:

constraint_type constraint_name
DEFAULT on column x DF___temp__x__5A3B20F9
Run Code Online (Sandbox Code Playgroud)

因此,列定义中的default子句只是创建约束的快捷方式; 默认值不是列的固有属性.如果要修改现有列的默认值,则必须先删除约束:

alter table _temp drop constraint DF___temp__x__5A3B20F9 
Run Code Online (Sandbox Code Playgroud)

然后创建一个新的默认约束:

alter table _temp add constraint DF_temp_x default 2 for x
Run Code Online (Sandbox Code Playgroud)

  • 我只会添加如何获取约束名称到您的解释:SELECT NAME FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID('dbo.MyTable'); 这样做可以帮助您了解要再次删除/添加哪个约束. (13认同)
  • 这清楚地表明了为什么明确命名**你的约束是如此重要!想象一下,你想放弃这个约束......如果你知道它被称为`DF_Temp_X`(而不是系统生成的`DF ___ temp__x__5A3B20F9`),它会变得多么容易 (5认同)
  • @ Ruben.Canton:"sp_help TABLE_NAME"也做到了. (3认同)

小智 28

DECLARE @Command nvarchar(max), @ConstraintName nvarchar(max), @TableName nvarchar(max), @ColumnName nvarchar(max)
SET @TableName = 'TableName'
SET @ColumnName = 'ColumnName'
SELECT @ConstraintName = name
    FROM sys.default_constraints
    WHERE parent_object_id = object_id(@TableName)
        AND parent_column_id = columnproperty(object_id(@TableName), @ColumnName, 'ColumnId')

SELECT @Command = 'ALTER TABLE ' + @TableName + ' DROP CONSTRAINT ' + @ConstraintName  
EXECUTE sp_executeSQL @Command

SELECT @Command = 'ALTER TABLE ' + @TableName + ' ADD CONSTRAINT ' + @ConstraintName + ' DEFAULT 1 FOR ' + @ColumnName 
EXECUTE sp_executeSQL @Command
Run Code Online (Sandbox Code Playgroud)

  • @LukasEder可能是对SQL Server在约束名称是系统生成时删除默认值所需的代码量的反应,与例如PostgreSQL相比:ALTER TABLE TableName ALTER COLUMN ColumnName DROP DEFAULT; (2认同)

You*_*Bob 12

您应该删除DEFAULT约束并添加一个这样的新约束

alter table Mytable
drop constraint <constraint name>
go
alter table MyTable
add constraint df_MyTable_MyColumn default -1 for MyColumn
go
Run Code Online (Sandbox Code Playgroud)

使用sp_helpconstraint MyTable获取约束名称


Jod*_*dyT 7

DEFAULT是一种约束.你想用ALTER TABLE ADD CONSTRAINT.

ALTER TABLE MyTable
ADD CONSTRAINT <constraint name>
DEFAULT -1 FOR MyColumn
Run Code Online (Sandbox Code Playgroud)

您需要先删除当前约束,例如:

ALTER TABLE MyTable
DROP CONSTRAINT <constraint name>
Run Code Online (Sandbox Code Playgroud)