更改列,添加默认约束

212

我有一个表,其中一列是datetime类型的“日期”。我们决定给该列添加一个默认约束

Alter table TableName
alter column dbo.TableName.Date default getutcdate() 

但是这会让我出现错误:

附近有“.”的语法不正确。

除了列名应该取一个更好的名称之外,有人看到这里明显有什么问题吗,而我却没有察觉到?


12
不要使用类型或关键字作为列名! - JonH
8
好的,同意 - “除了给这一列取一个更好的名字之外,有没有人发现我漏掉了什么明显的错误?” - ram
7个回答

387

试试这个。

alter table TableName 
 add constraint df_ConstraintNAme 
 default getutcdate() for [Date]

例子

create table bla (id int)

alter table bla add constraint dt_bla default 1 for id



insert bla default values

select * from bla

还要确保给默认约束命名...因为它将拥有那些疯狂的系统生成名称,稍后删除它将会很麻烦...也请参阅如何命名默认约束以及如何在SQL Server中删除没有名称的默认约束


插入“bla”默认值是干什么的?我认为设置约束应该为您设置默认值。 - John Lord

7

您可以将保留字用方括号括起来,以避免此类错误:

dbo.TableName.[Date]

1
使用保留字作为列名似乎是一个非常糟糕的想法。 - Norbert Norbertson
4
看起来是这样,但实际上并不是。我自2004年以来一直成功地使用它们 :) - Cătălin Rădoi

7
实际上,您需要像以下示例一样操作,这将有助于解决问题...
drop table ABC_table

create table ABC_table
(
    names varchar(20),
    age int
)

ALTER TABLE ABC_table
ADD CONSTRAINT MyConstraintName
DEFAULT 'This is not NULL' FOR names

insert into ABC(age) values(10)

select * from ABC

这只是用于练习,不能在实际中使用。 - Trương Long

7

我使用下面的存储过程来更新列上的默认值。

它会自动删除该列上的先前默认值,然后添加新的默认值。

用法示例:

-- Update default to be a date.
exec [dbo].[AlterDefaultForColumn] '[dbo].[TableName]','Column','getdate()';
-- Update default to be a number.
exec [dbo].[AlterDefaultForColumn] '[dbo].[TableName]','Column,'6';
-- Update default to be a string. Note extra quotes, as this is not a function.
exec [dbo].[AlterDefaultForColumn] '[dbo].[TableName]','Column','''MyString''';

存储过程:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- Sample function calls:
--exec [dbo].[AlterDefaultForColumn] '[dbo].[TableName]','ColumnName','getdate()';
--exec [dbol].[AlterDefaultForColumn] '[dbo].[TableName]','Column,'6';
--exec [dbo].[AlterDefaultForColumn] '[dbo].[TableName]','Column','''MyString''';
create PROCEDURE [dbo].[ColumnDefaultUpdate]
    (
        -- Table name, including schema, e.g. '[dbo].[TableName]'
        @TABLE_NAME VARCHAR(100), 
        -- Column name, e.g. 'ColumnName'.
        @COLUMN_NAME VARCHAR(100),
        -- New default, e.g. '''MyDefault''' or 'getdate()'
        -- Note that if you want to set it to a string constant, the contents
        -- must be surrounded by extra quotes, e.g. '''MyConstant''' not 'MyConstant'
        @NEW_DEFAULT VARCHAR(100)
    )
AS 
BEGIN       
    -- Trim angle brackets so things work even if they are included.
    set @COLUMN_NAME = REPLACE(@COLUMN_NAME, '[', '')
    set @COLUMN_NAME = REPLACE(@COLUMN_NAME, ']', '')

    print 'Table name: ' + @TABLE_NAME;
    print 'Column name: ' + @COLUMN_NAME;
    DECLARE @ObjectName NVARCHAR(100)
    SELECT @ObjectName = OBJECT_NAME([default_object_id]) FROM SYS.COLUMNS
    WHERE [object_id] = OBJECT_ID(@TABLE_NAME) AND [name] = @COLUMN_NAME;

    IF @ObjectName <> '' 
    begin
        print 'Removed default: ' + @ObjectName;
        --print('ALTER TABLE ' + @TABLE_NAME + ' DROP CONSTRAINT ' + @ObjectName)
        EXEC('ALTER TABLE ' + @TABLE_NAME + ' DROP CONSTRAINT ' + @ObjectName)
    end

    EXEC('ALTER TABLE ' + @TABLE_NAME + ' ADD  DEFAULT (' + @NEW_DEFAULT + ') FOR ' + @COLUMN_NAME)
    --print('ALTER TABLE ' + @TABLE_NAME + ' ADD  DEFAULT (' + @NEW_DEFAULT + ') FOR ' + @COLUMN_NAME)
    print 'Added default of: ' + @NEW_DEFAULT;
END

该存储过程能够消除以下错误

如果您尝试为已经存在默认值的列添加一个默认值,将会出现以下错误(如果使用此存储过程,您将永远不会看到这个错误):

-- Using the stored procedure eliminates this error:
Msg 1781, Level 16, State 1, Line 1
Column already has a DEFAULT bound to it.
Msg 1750, Level 16, State 0, Line 1
Could not create constraint. See previous errors.

2
我确认像JohnH的评论一样,从不在对象名称中使用列类型!这很令人困惑。如果可能,请使用括号。 尝试这个:
ALTER TABLE [TableName]
ADD  DEFAULT (getutcdate()) FOR [Date]; 

最好使用“双引号”,因为这是ANSI标准。 - Manngo

1

修改表 TableName 删除约束 DF_TableName_WhenEntered

修改表 TableName 添加约束 DF_TableName_WhenEntered 默认值为 getutcdate(),用于 WhenEntered


此答案还包含了删除约束条件的查询语句。如果有人之前添加了 getdate(),现在需要将其更改为 getutcdate(),他可能会通过这个答案得到一些帮助。 @RalfFriedl - Abhijit Poojari

0

您正在指定表名两次。 ALTER TABLE 部分命名了表格。 尝试: Alter table TableName alter column [Date] default getutcdate()


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