如何为现有的列设置默认值

464

这段代码在 SQL Server 2008 中无法工作:

ALTER TABLE Employee ALTER COLUMN CityBorn SET DEFAULT 'SANDNES'

出现错误:

关键字'SET'附近的语法不正确。

我做错了什么?


1
你读MSDN ALTER TABLE的内容了吗?http://msdn.microsoft.com/zh-cn/library/ms187742(SQL.90).aspx - gbn
2
可能是重复的问题:T-SQL命令添加默认约束 - user565869
可能是重复的问题:如何在SQL Server中向现有表添加一个具有默认值的列。链接 - Trilarion
1
那是MySQL语法。 - Benjamin Goodacre
1
为什么不是每个人都遵循一个标准呢?(这不是一个真正的问题,每个人都指微软和MySQL或其他供应商)。是否有一种ANSI / ISO标准的方法来做到这一点? - joedotnot
14个回答

688

这将适用于SQL Server:

ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;

77
+1 表示指定约束名称,这样 SQL Server 就不会创建一个随机的名称。 - HardCode
48
MSSQL 把默认值称作“约束条件”有些奇怪。实际上,它们更像是“放宽条件”,与“约束条件”相反!它们使得更多的事情合法,而不是减少限制。 - Roman Starkov
4
如果你以另一种方式思考,比如:默认约束条件会防止MSSQL在未指定列的情况下抛出错误,那么这并不奇怪。因此,这不是对用户的限制,而是对MSSQL的限制。 - Jonny Piazzi
5
只有在该列上没有现有的默认约束时,此方法才有效。是的,因为根据定义,您不能拥有多个默认值... - Yuck
4
@Yuck。 如果回答包括检查默认设置是否已存在的内容,那么答案就会更有用。 - pmcilreavy
显示剩余6条评论

205
ALTER TABLE Employee ADD DEFAULT 'SANDNES' FOR CityBorn

4
这在MSSQL中有效,但缺点是它不会命名在幕后创建的约束(请参见上面得到更高票数的答案)。 - Contango
12
我认为最好不要费心命名每一个约束条件,以防需要修改其中之一。只需编写一个自动删除未命名约束的程序,您就再也不必命名约束条件了,同时可以处理所有其他未命名的约束条件。 - JonnyRaa
3
@Jonny Leeds. 很好的观点。我也喜欢列出限制条件,因为这对于其他人尝试修改(或仅仅是理解)数据库架构来说是很好的文档记录。如果一个人是独立操作员,在一个人的团队中工作,这就不那么重要了。 - Contango
1
我需要它可以重新运行,并找到了这种方法来检查它是否已经完成...IF EXISTS(SELECT * FROM information_schema.columns WHERE table_name='myTable' AND column_name='myColumn' AND Table_schema = 'myDBO' AND column_default IS NULL) BEGIN ALTER TABLE [myDBO].[myTable] ADD DEFAULT 0 FOR [myColumn] END - Dave
5
如果只有一个默认约束条件...为什么还要给它命名?看起来其他数据库引擎提供了语法,可以在没有列名之外的任何名称的情况下添加、更新、删除列的默认值,这很合理。顺便说一下,上面的代码如果已经存在默认值,则会失败。SQL Server需要针对系统表进行复杂的连接才能识别默认约束条件的名称,这是荒谬的,因为一个列上只能有一个默认约束条件,所以这不应该是必需的。 - Triynko

74

无法使用 alter column,应该使用 add

ALTER TABLE Employee 
ADD DEFAULT('SANDNES') FOR CityBorn

13
不知道为什么这个答案没有得到赞同,它和之前的答案完全相同,并且早些时候就已经回答了... - spankmaster79

40

正确的操作方法如下:

  1. 运行以下命令:

  2. sp_help [table name] 
    
  3. 复制CONSTRAINT的名称。

  4. 删除DEFAULT CONSTRAINT

  5. ALTER TABLE [table name] DROP [NAME OF CONSTRAINT] 
    
  6. 运行以下命令:

  7. ALTER TABLE [table name] ADD DEFAULT [DEFAULT VALUE] FOR [NAME OF COLUMN]
    

6
StackOverflow.com 仅支持英语。葡萄牙语站点为 http://pt.stackoverflow.com/。 - Martin Smith
1
这并没有为其他答案添加任何新内容,它是一种手动方法 - 无法脚本化,并且它被认为是“正确的方法”... - Andre Figueiredo

14

Hoodaticus的解决方案非常完美,谢谢。不过我还需要它可重新运行,并发现了这种检查方法...

IF EXISTS(SELECT * FROM information_schema.columns 
           WHERE table_name='myTable' AND column_name='myColumn' 
             AND Table_schema='myDBO' AND column_default IS NULL) 
BEGIN 
  ALTER TABLE [myDBO].[myTable] ADD DEFAULT 0 FOR [myColumn] --Hoodaticus
END

9

有两种情况下列的默认值可能会被更改:

  1. 在创建表格时
  2. 修改现有表格中的列。

  1. 在创建表格/创建新列时。

查询

create table table_name
(
    column_name datatype default 'any default value'
);
  1. 修改现有表格的列

在这种情况下,我的SQL服务器不允许修改现有默认约束值。因此,要更改默认值,我们需要删除现有的系统生成或用户生成的默认约束。然后可以为特定列设置默认值。

按照以下步骤操作:

  1. 列出所有现有列的默认值约束。

执行此系统数据库过程,它以表名作为参数,并返回表中所有列的所有约束列表。

execute [dbo].[sp_helpconstraint] 'table_name'
  1. 删除某个列现有的默认约束。

语法:

alter table 'table_name' drop constraint 'constraint_name'
  1. 为该列添加新的默认值约束:

语法:

alter table 'table_name' add default 'default_value' for 'column_name'

加油 @!!!


7

如果已经存在一个具有默认名称的限制:

-- Drop existing default constraint on Employee.CityBorn
DECLARE @default_name varchar(256);
SELECT @default_name = [name] FROM sys.default_constraints WHERE parent_object_id=OBJECT_ID('Employee') AND COL_NAME(parent_object_id, parent_column_id)='CityBorn';
EXEC('ALTER TABLE Employee DROP CONSTRAINT ' + @default_name);

-- Add default constraint on Employee.CityBorn
ALTER TABLE Employee ADD CONSTRAINT df_employee_1 DEFAULT 'SANDNES' FOR CityBorn;

7

以下是语法,欲了解更多信息,请参阅此问题和答案:在 SQL Server 中添加具有默认值的列到现有表中

语法:

ALTER TABLE {TABLENAME} 
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} 
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES

例子:

ALTER TABLE SomeTable
ADD SomeCol Bit NULL --Or NOT NULL.
CONSTRAINT D_SomeTable_SomeCol --When Omitted a Default-Constraint Name is 
autogenerated.
DEFAULT (0)--Optional Default-Constraint.
WITH VALUES --Add if Column is Nullable and you want the Default Value for Existing Records.

另一种方法:

右键单击表格,然后点击“设计”,接着点击要设置默认值的列。

在页面底部添加一个默认值或绑定:例如字符串的“1”或整数的1。


7

首先,删除约束。

https://dev59.com/NXM_5IYBdhLWcg3wdzDz#49393045

DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS
WHERE PARENT_OBJECT_ID = OBJECT_ID('__TableName__')
AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns
                        WHERE NAME = N'__ColumnName__'
                        AND object_id = OBJECT_ID(N'__TableName__'))
IF @ConstraintName IS NOT NULL
EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)

第二步:创建默认值

ALTER TABLE [table name] ADD DEFAULT [default value] FOR [column name]

6
ALTER TABLE [dbo].[Employee] ADD  DEFAULT ('N') FOR [CityBorn]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接