如何为现有列设置默认值


375

这在SQL Server 2008中不起作用:

ALTER TABLE Employee ALTER COLUMN CityBorn SET DEFAULT 'SANDNES'

错误是:

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

我究竟做错了什么?


1
您在阅读MSDN ALTER TABLE时说了什么?msdn.microsoft.com/zh-CN/library/ms187742(SQL.90).aspx
gbn



1
那是mysql语法。
本杰明·古德克莱

为什么每个人都不能只遵守标准?(不是一个真正的问题,每个人都指Microsoft和mysql或其他供应商)。有没有ansi / iso标准的方式来做到这一点?
joedotnot

Answers:


566

这将在SQL Server中工作:

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

62
+1用于指定约束名称,因此SQL Server不会创建随机名称。
HardCode

36
MSSQL对于将默认值称为“约束”感到很奇怪。如果有的话,那是放松。在对面的一个约束!它们使更多的东西有效,而不是更少。
罗曼·斯塔科夫

4
如果您以其他方式思考,这并不奇怪:如果未指定列,则默认约束可防止MSSQL引发错误。因此,这不是对用户的约束,而是对MSSQL的约束。
强尼·皮亚齐

4
仅当列上不存在默认约束时,此方法才有效。
pmcilreavy

4
@fallenidol 仅当列上不存在默认约束时,此方法才有效。是的,因为根据定义,您不能有多个默认值...
Yuck

165
ALTER TABLE Employee ADD DEFAULT 'SANDNES' FOR CityBorn

3
这在MSSQL中有效,但是它的缺点是它没有命名其在幕后创建的约束(请参见上面的较高投票答案)。
Contango 2014年

10
@Contango我认为最好不要在您需要修改其中一个的offchance上命名每个约束。只需编写一个删除自动命名约束的过程,您就不必再命名了+可以处理所有其他未命名约束
JonnyRaa 2015年

3
@乔尼·利兹 好点子。我还想命名约束,因为它是其他任何试图修改(或简单理解)数据库模式的人的好文档。如果一个人是一个团队的独奏者,这一点就不那么重要了。
康坦戈

1
(EESH!很抱歉缺少换行符-为了清楚起见,在下面粘贴!)我需要重新运行它,并找到这种方式来检查它是否已经完成... IF EXISTS(SELECT * FROM information_schema.columns在哪里table_name ='myTable'AND column_name ='myColumn'AND Table_schema ='myDBO'AND column_default为NULL)开始更改表[myDBO]。[myTable]为[myColumn]添加默认0 END
戴夫

4
如果只有一个默认约束...为什么要命名呢?看起来其他数据库引擎提供了用于添加,更新,删除列的默认值的语法,而没有列名以外的任何其他名称,这是有意义的。如果默认值已经存在,则上述代码将失败,顺便说一句。荒谬的是,SQL Server要求针对系统表进行复杂的联接只是为了标识默认约束的名称,这是不必要的,因为列上只能有一个默认约束。
Triynko '16

51

不能为此使用alter column,而是使用add

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

9
不知道为什么这个答案没有得到好评。它与之前的完全相同,并且在早些时候得到了答复……
spankmaster79

30

正确的方法如下:

  1. 运行命令:

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

  3. 删除DEFAULT CONSTRAINT

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

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

4
StackOverflow.com仅是英语。葡萄牙语网站是pt.stackoverflow.com-
马丁·史密斯

这并不是新添加没什么其他的答案,是一个手工方法-不能照本宣科,并且声明是“正确的方法” ..
安德烈·菲格雷多

12

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

7

在两种情况下,可以更改列的默认值,

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

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

询问

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

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

请遵循以下步骤:

  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'

欢呼@ !!!


5

如果默认名称已经存在限制:

-- 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;

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

4

您可以使用以下语法,有关更多信息,请参见以下问题和解答: 将具有默认值的列添加到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的整数。


3

Just Found 3个简单步骤即可更改之前为null的现有列

update   orders
set BasicHours=0 where BasicHours is null

alter table orders 
add default(0) for BasicHours

alter table orders 
alter  column CleanBasicHours decimal(7,2) not null 

3

第一滴约束

https://stackoverflow.com/a/49393045/2547164

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]


1

就像Yuck的答案一样,通过选中该脚本可以多次运行脚本而不会出错。(比使用information_schema.columns更少的代码/自定义字符串)

IF object_id('DF_SomeName', 'D') IS NULL BEGIN
    Print 'Creating Constraint DF_SomeName'
   ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;
END
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.