更改列,添加默认约束

时间:2010-01-19 17:02:33

标签: sql-server sql-server-2008 tsql alter-table alter-column

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

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

但是这给了我错误:

  

'。'

附近的语法不正确

有没有人在这里看到任何明显错误的东西,我错过了(除了有更好的名称之外)

7 个答案:

答案 0 :(得分:326)

试试这个

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

还要确保你将默认约束命名为..稍后放下它会很痛苦,因为它会有一个疯狂的系统生成名称...另请参阅How To Name Default Constraints And How To Drop Default Constraint Without A Name In SQL Server

答案 1 :(得分:7)

你可以用方括号括起保留字来避免这些错误:

dbo.TableName.[Date]

答案 2 :(得分: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.

答案 3 :(得分:5)

实际上你必须在下面的例子中做,这将有助于解决问题......

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

答案 4 :(得分:0)

您两次指定表名。 ALTER TABLE部件为表命名。 尝试: 修改表TableName 更改列[日期]默认getutcdate()

答案 5 :(得分:0)

变更表TableName  放置约束DF_TableName_WhenEntered

变更表TableName  添加约束DF_TableName_WhenEntered  预设为getEntercdate()的输入时间

答案 6 :(得分:0)

我确认喜欢 JohnH 的评论,永远不要在您的对象名称中使用列类型! 这很混乱。并尽可能使用括号。

试试这个:

ALTER TABLE [TableName]
ADD  DEFAULT (getutcdate()) FOR [Date];