Змініть стовпчик, додайте обмеження за замовчуванням


187

У мене є таблиця, і один із стовпців - "Дата" типу datetime. Ми вирішили додати до цього стовпця обмеження за замовчуванням

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

але це дає мені помилку:

Неправильний синтаксис біля "."

Хтось бачить тут щось явно не так, чого я пропускаю (крім того, щоб мати кращу назву стовпця)


11
Не використовуйте типи чи ключові слова як назви стовпців!
JonH

8
Так, погодився- "Хтось бачить тут щось явно не так, чого я пропускаю (крім того, щоб мати кращу назву для колонки)"
ram

Відповіді:


349

Спробуйте це

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


7

ви можете загортати зарезервовані слова у квадратні дужки, щоб уникнути таких помилок:

dbo.TableName.[Date]

1
Використовувати зарезервовані слова для імен стовпців виглядає дуже погано.
Норберт Норбертсон

4
Здається, але це не так. Я їх успішно використовую з 2004 року :)
Cătălin Rădoi

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.

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

Це просто використання для практики, не може використовувати в реальності
Trương Long

0

Ви вказуєте ім'я таблиці двічі. Частина ALTER TABLE називає таблицю. Спробуйте: Змінити таблицю змінного стовпця TableName [Дата] за замовчуванням getutcdate ()


0

змінити обмеження падіння таблиці TableName DF_TableName_WhenEntered

змінити таблицю TableName додати обмеження DF_TableName_WhenEntered за замовчуванням getutcdate () для WhenEntered


ця відповідь містить також запит на обмеження падіння. Якщо хтось раніше додав getdate (), тепер йому потрібно змінити його на getutcdate (). він може отримати допомогу через цю відповідь. @RalfFriedl
Abhijit Poojari
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.