열 변경, 기본 제약 조건 추가


187

테이블이 있고 열 중 하나가 날짜 시간 유형의 "날짜"입니다. 해당 열에 기본 제약 조건을 추가하기로 결정했습니다.

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

그러나 이것은 나에게 오류를 준다 :

'.'근처의 구문이 잘못되었습니다.

누구든지 여기에 분명히 잘못된 것을 보았습니까?


11
유형이나 키워드를 열 이름으로 사용하지 마십시오!
JonH

8
p, 동의- "누군가가 여기에 분명히 잘못된 것을 보았습니까 (열에 대한 더 나은 이름을 갖는 것 제외)"
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
열 이름에 예약어를 사용하는 것은 정말 나쁜 생각 인 것 같습니다.
Norbert Norbertson

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

테이블 변경 테이블 이름 삭제 제약 조건 DF_TableName_WhenEntered

테이블 변경 테이블 이름 추가 제한 조건 DF_TableName_WhenEntered WhenEntered에 대한 기본 getutcdate ()


이 답변에는 드롭 제약 조건 쿼리도 포함되어 있습니다. 그는이 답변을 통해 도움을받을 수 있습니다. @RalfFriedl
Abhijit Poojari 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.