SQL Server의 기존 테이블에 기본값을 가진 열 추가


답변:


3497

통사론:

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.

노트:

선택적 제약 조건 이름 :
생략 CONSTRAINT D_SomeTable_SomeCol하면 SQL Server는 다음
    과 같은 재미있는 이름으로 기본 제약 조건 을 자동 생성 합니다.DF__SomeTa__SomeC__4FB7FEF6

옵션으로-값 문 :
WITH VALUES만 열이 널 때 필요
    하고 가치가 레코드를 기존에 사용되는 기본을합니다.
열이 NOT NULL인 경우
    , 지정 여부에 관계없이 모든 기존 레코드 의 기본값을 자동으로 사용합니다 WITH VALUES.

삽입이 기본 제약 조건으로 작동하는 방법 :
레코드를 레코드에 삽입하고 값을 지정 SomeTable하지 않으면SomeCol 기본값이로 설정됩니다 0.
레코드 지정 하고SomeCol 의 값을 다음과 같이 지정 하면 NULL(열에 널이 허용됨)
    기본 제한 조건이 사용 되지 않고NULL 값으로 삽입됩니다.

메모는 아래의 모든 사람의 훌륭한 피드백을 바탕으로 작성되었습니다.     의견을 주신 @Yatrix, @WalterStabosz, @YahooSerious 및 @StackMan에게
감사드립니다
.


332
열이 널 입력 가능하면 기존 행에 사용되는 값이 널이됩니다.
Richard Collette

17
@Thecrocodilehunter Nullable 열은 열 값에 Null을 삽입 할 수 있음을 의미합니다. 널 입력 가능 컬럼이 아닌 경우 해당 데이터 유형의 일부 값을 삽입해야합니다. 따라서 기존 레코드의 경우 Null이 레코드에 삽입되고 새 레코드에 다르게 지정되지 않는 한 기본값이 삽입됩니다. 말이 되나요?
Yatrix

41
이 답변은 기본 제약 조건의 이름을 명시 적으로 지정하기 때문에 dbugger보다 약간 더 좋습니다. 기본 제약 조건은 이름이 자동 생성되는 것을 제외하고 dbugger의 구문을 사용하여 생성됩니다. DROP-CREATE 스크립트를 작성할 때 정확한 이름을 아는 것이 편리합니다.
Walter Stabosz

18
@Vertigo 열이 인 경우에만 해당됩니다 NOT NULL. 이것을 시도하십시오 : create table blah(a int not null primary key clustered); insert blah values (1), (2); alter table blah add b int null constraint df_blah_b default (0); select * from blah;column에 대해 2 개의 NULL 값이 표시됩니다 b.
ErikE

48
WITH VALUES기존 널 입력 가능 행을 업데이트하는 데 사용 합니다. 참조 MSDN을 "추가 된 열이 null 값을 허용하고있는 경우 WITH VALUES기본 값이 기존 행에 추가 된 새로운 컬럼에 저장되어 지정됩니다."
야후 진지한

1008
ALTER TABLE Protocols
ADD ProtocolTypeID int NOT NULL DEFAULT(1)
GO

DEFAULT를 포함하면 기존 행 의 열 이 기본값으로 채워 지므로 NOT NULL 제한 조건이 위반되지 않습니다.


13
이 답변의 문제점은 기본값이 새 레코드에만 유효하다는 것입니다. 기존 레코드는 여전히 NULL 값을 갖습니다.
Roee Gavirel

130
당신은 그렇지 않다는 것을 알게 될 것입니다. 그렇지 않으면 구속 조건이 위반됩니다.
dbugger

35
기존 행의 열은 기본값으로 채워집니다. 약간의 경험적 테스트가 그것을 증명할 것입니다.
dbugger

80
명확히하기 위해-명령에서 "NOT NULL"을 생략하면 기존 행의 값이 업데이트되지 않고 NULL로 유지됩니다. "NOT NULL"이 명령에 포함되면 기존 행의 값이 기본값과 일치하도록 업데이트됩니다.
Stack Man

15
여러 열에 대해 ALTER TABLE table_1 ADD col_1 int NOT NULL DEFAULT (1), col_2 int NULL
aads

233

추가하면 널 열 , WITH VALUES특정 디폴트 값이 존재하는 행에 적용되도록한다 :

ALTER TABLE table
ADD column BIT     -- Demonstration with NULL-able column added
CONSTRAINT Constraint_name DEFAULT 0 WITH VALUES

13
이것이 핵심입니다. DEFAULT제약 조건이 있는 열에 항상 값이 있다고 가정하기 쉽습니다. 즉, NOT NULL지정되지 않은 경우 에도 NULL 이 아닙니다.
Bill Brinkley

6
@ tkocmathla 어, 나는 BIT데이터 유형 에 대해 이야기하지 않고이 특정 BIT 열에 대해 이야기하고있었습니다 . 답을 보면 열이로 선언됩니다 NOT NULL.
rsenna

136
ALTER TABLE <table name> 
ADD <new column name> <data type> NOT NULL
GO
ALTER TABLE <table name> 
ADD CONSTRAINT <constraint name> DEFAULT <default value> FOR <new column name>
GO

7
이하지 않습니다 일 새로운 "Null을 허용하지"열이 기본 값 제약 이전에 생성되기 때문에 테이블이 이미 내용이있는 경우
WDuffy

129
ALTER TABLE MYTABLE ADD MYNEWCOLUMN VARCHAR(200) DEFAULT 'SNUGGLES'

13
이 null 추가! 전에 null이 아니
어야

5
@baaroz, NOT NULL이 작품 : ALTER TABLE MYTABLE의 ADD MYNEWCOLUMN VARCHAR (200) NOT NULL의 DEFAULT 'SNUGGLES'
shaijut

100

추가하는 열에 NOT NULL제약 조건이 있지만 DEFAULT제약 조건 (값) 이없는 경우주의하십시오 . 이 ALTER TABLE경우 테이블에 행이 있으면 명령문이 실패합니다. 해결책은 NOT NULL새 열에서 제약 조건을 제거하거나 제약 조건을 제공하는 DEFAULT것입니다.


2
어떤 SQL 샘플 그것에 대해?
Kiquenet

98

두 줄만있는 가장 기본적인 버전

ALTER TABLE MyTable
ADD MyNewColumn INT NOT NULL DEFAULT 0

81

사용하다:

-- Add a column with a default DateTime  
-- to capture when each record is added.

ALTER TABLE myTableName  
ADD RecordAddedDate SMALLDATETIME NULL DEFAULT (GETDATE())  
GO 

79

여러 열을 추가하려는 경우 다음과 같은 방법으로 열을 추가 할 수 있습니다.

ALTER TABLE YourTable
    ADD Column1 INT NOT NULL DEFAULT 0,
        Column2 INT NOT NULL DEFAULT 1,
        Column3 VARCHAR(50) DEFAULT 'Hello'
GO


54

기본값을 사용하여 기존 데이터베이스 테이블에 열을 추가하려면 다음을 사용할 수 있습니다.

ALTER TABLE [dbo.table_name]
    ADD [Column_Name] BIT NOT NULL
Default ( 0 )

다음은 기본값을 사용하여 기존 데이터베이스 테이블에 열을 추가하는 다른 방법입니다.

기본값을 사용하여 열을 추가하는 훨씬 더 철저한 SQL 스크립트는 열을 추가하기 전에 열이 있는지 확인하고 제약 조건을 확인하고 열이 있으면 삭제하는 것을 포함하여 아래에 있습니다. 이 스크립트는 또한 제약 조건의 이름을 지정하므로 멋진 명명 규칙을 가질 수 있습니다 (DF_를 좋아합니다). 그렇지 않으면 SQL에서 무작위로 생성 된 숫자가있는 이름의 제약 조건을 제공합니다. 구속 조건의 이름도 지정할 수있어서 좋습니다.

-------------------------------------------------------------------------
-- Drop COLUMN
-- Name of Column: Column_EmployeeName
-- Name of Table: table_Emplyee
--------------------------------------------------------------------------
IF EXISTS (
            SELECT 1
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_NAME = 'table_Emplyee'
              AND COLUMN_NAME = 'Column_EmployeeName'
           )
    BEGIN

        IF EXISTS ( SELECT 1
                    FROM sys.default_constraints
                    WHERE object_id = OBJECT_ID('[dbo].[DF_table_Emplyee_Column_EmployeeName]')
                      AND parent_object_id = OBJECT_ID('[dbo].[table_Emplyee]')
                  )
            BEGIN
                ------  DROP Contraint

                ALTER TABLE [dbo].[table_Emplyee] DROP CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]
            PRINT '[DF_table_Emplyee_Column_EmployeeName] was dropped'
            END
     --    -----   DROP Column   -----------------------------------------------------------------
        ALTER TABLE [dbo].table_Emplyee
            DROP COLUMN Column_EmployeeName
        PRINT 'Column Column_EmployeeName in images table was dropped'
    END

--------------------------------------------------------------------------
-- ADD  COLUMN Column_EmployeeName IN table_Emplyee table
--------------------------------------------------------------------------
IF NOT EXISTS (
                SELECT 1
                FROM INFORMATION_SCHEMA.COLUMNS
                WHERE TABLE_NAME = 'table_Emplyee'
                  AND COLUMN_NAME = 'Column_EmployeeName'
               )
    BEGIN
    ----- ADD Column & Contraint
        ALTER TABLE dbo.table_Emplyee
            ADD Column_EmployeeName BIT   NOT NULL
            CONSTRAINT [DF_table_Emplyee_Column_EmployeeName]  DEFAULT (0)
        PRINT 'Column [DF_table_Emplyee_Column_EmployeeName] in table_Emplyee table was Added'
        PRINT 'Contraint [DF_table_Emplyee_Column_EmployeeName] was Added'
     END

GO

기본값을 사용하여 기존 데이터베이스 테이블에 열을 추가하는 두 가지 방법이 있습니다.


52

다음과 같은 방법으로 T-SQL로 작업을 수행 할 수 있습니다.

 ALTER TABLE {TABLENAME}
 ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
 CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}

디자인 메뉴에서 테이블을 마우스 오른쪽 단추로 클릭하여 기본값을 테이블로 설정하여 SQL Server Management Studio를 사용할 수도 있습니다.

또한 데이터베이스의 모든 테이블에 동일한 열 (없는 경우)을 추가하려면 다음을 사용하십시오.

 USE AdventureWorks;
 EXEC sp_msforeachtable
'PRINT ''ALTER TABLE ? ADD Date_Created DATETIME DEFAULT GETDATE();''' ;

50

SQL Server 2008-R2에서는 테스트 데이터베이스에서 디자인 모드로 이동하여 디자이너를 사용하여 두 개의 열을 추가하고 GUI를 사용하여 설정 한 다음 악의적 인 사용자 Right-Click에게 " 변경 스크립트 생성 "옵션을 제공합니다 !

Bang Up은 올바른 형식의 작업 보장 변경 스크립트를 사용하여 작은 창을 띄웁니다. 쉬운 버튼을 누르십시오.


48

또는 제약 조건의 이름을 명시 적으로 지정하지 않고도 기본값을 추가 할 수 있습니다.

ALTER TABLE [schema].[tablename] ADD  DEFAULT ((0)) FOR [columnname]

이 제한 조건을 작성할 때 기존 기본 제한 조건에 문제가있는 경우 다음을 통해 제거 할 수 있습니다.

alter table [schema].[tablename] drop constraint [constraintname]

1
참고로 유지 관리가 용이하도록 표준 명명 체계 (예 : "DF_Table_Column")를 사용하여 제약 조건을 명시 적으로 명명합니다. 그렇지 않으면 구속 조건을 찾으려면 더 많은 작업이 필요합니다.
Mike Christian

43

이것은 SSMS GUI에서도 가능합니다. 아래에 기본 날짜를 표시하지만 기본값은 물론 무엇이든 될 수 있습니다.

  1. 테이블을 디자인 뷰에 배치하십시오 (객체 탐색기-> 디자인에서 테이블을 마우스 오른쪽 버튼으로 클릭하십시오)
  2. 테이블에 열을 추가하거나 이미 존재하는 경우 업데이트하려는 열을 클릭하십시오.
  3. 열 속성에서 다음을 입력 (getdate())또는 abc또는 0또는 당신이 원하는 값 기본값 또는 바인딩 아래 그림과 같이 필드 :

여기에 이미지 설명을 입력하십시오



31

예:

ALTER TABLE [Employees] ADD Seniority int not null default 0 GO


22

먼저 이름이 student 인 테이블을 만듭니다.

CREATE TABLE STUDENT (STUDENT_ID INT NOT NULL)

여기에 하나의 열을 추가하십시오.

ALTER TABLE STUDENT 
ADD STUDENT_NAME INT NOT NULL DEFAULT(0)

SELECT * 
FROM STUDENT

테이블이 작성되고 기본값이있는 기존 테이블에 열이 추가됩니다.

이미지 1


19

여기에는 많은 답변이 있지만이 확장 방법을 추가해야한다고 생각합니다. 이것은 훨씬 길어 보이지만 활성 데이터베이스에 수백만 행이있는 테이블에 NOT NULL 필드를 추가하는 경우 매우 유용합니다.

ALTER TABLE {schemaName}.{tableName}
    ADD {columnName} {datatype} NULL
    CONSTRAINT {constraintName} DEFAULT {DefaultValue}

UPDATE {schemaName}.{tableName}
    SET {columnName} = {DefaultValue}
    WHERE {columName} IS NULL

ALTER TABLE {schemaName}.{tableName}
    ALTER COLUMN {columnName} {datatype} NOT NULL

이 작업은 열을 nullable 필드로 추가하고 기본값을 사용하여 모든 필드를 기본값으로 업데이트하거나 더 의미있는 값을 지정할 수 있으며 마지막으로 열을 NOT NULL로 변경합니다.

그 이유는 대규모 테이블을 업데이트하고 널이 아닌 새 필드를 추가하면 모든 단일 행에 기록해야하므로 열을 추가 한 다음 모든 값을 쓸 때 전체 테이블을 잠 그게됩니다.

이 방법은 자체적으로 훨씬 빠르게 작동하는 nullable 열을 추가 한 다음 null이 아닌 상태를 설정하기 전에 데이터를 채 웁니다.

한 문장으로 전체 작업을 수행하면 4-8 분 동안 더 활동적인 테이블 중 하나가 잠기고 프로세스를 자주 종료했습니다. 이 방법은 일반적으로 각 부품이 몇 초만 걸리며 잠금이 최소화됩니다.

또한 수십억 행의 영역에 테이블이 있으면 업데이트를 일괄 처리하는 것이 좋습니다.

WHILE 1=1
BEGIN
    UPDATE TOP (1000000) {schemaName}.{tableName}
        SET {columnName} = {DefaultValue}
        WHERE {columName} IS NULL

    IF @@ROWCOUNT < 1000000
        BREAK;
END


18

SQL Server + 테이블 변경 + 열 추가 + 기본값 uniqueidentifier

ALTER TABLE Product 
ADD ReferenceID uniqueidentifier not null 
default (cast(cast(0 as binary) as uniqueidentifier))

18
IF NOT EXISTS (
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME ='TABLENAME' AND COLUMN_NAME = 'COLUMNNAME'
)
BEGIN
    ALTER TABLE TABLENAME ADD COLUMNNAME Nvarchar(MAX) Not Null default
END

3
내가 좋아하는 NOT EXISTS테이블을 변경하는 시도하기 전에 확인. 아주 좋은 해결책입니다. 이것이 어떻게 작동하는지에 대한 추가 논평은 더 유용 할 것입니다.
Michael Gaskill 2016 년

17
--Adding Value with Default Value
ALTER TABLE TestTable
ADD ThirdCol INT NOT NULL DEFAULT(0)
GO

이미지를 실제 코드로 바꾸시겠습니까? 그대로 복사하여 붙여 넣기가 어렵습니다.
David Faber

6
이것은 몇 년 전의 기존 답변보다 가치를 추가하지 않습니다.
nvoigt

14

테이블에 새 열을 추가하십시오.

ALTER TABLE [table]
ADD Column1 Datatype

예를 들어

ALTER TABLE [test]
ADD ID Int

사용자가 자동으로 늘리려면 다음을 수행하십시오.

ALTER TABLE [test]
ADD ID Int IDENTITY(1,1) NOT NULL

13

이것은 SQL Server 용입니다.

ALTER TABLE TableName
ADD ColumnName (type) -- NULL OR NOT NULL
DEFAULT (default value)
WITH VALUES

예:

ALTER TABLE Activities
ADD status int NOT NULL DEFAULT (0)
WITH VALUES

제약 조건을 추가하려면 다음을 수행하십시오.

ALTER TABLE Table_1
ADD row3 int NOT NULL
CONSTRAINT CONSTRAINT_NAME DEFAULT (0)
WITH VALUES

7
이것은 몇 년 전의 기존 답변보다 가치를 추가하지 않습니다.
nvoigt

11

이것은 아래 코드로 수행 할 수 있습니다.

CREATE TABLE TestTable
    (FirstCol INT NOT NULL)
    GO
    ------------------------------
    -- Option 1
    ------------------------------
    -- Adding New Column
    ALTER TABLE TestTable
    ADD SecondCol INT
    GO
    -- Updating it with Default
    UPDATE TestTable
    SET SecondCol = 0
    GO
    -- Alter
    ALTER TABLE TestTable
    ALTER COLUMN SecondCol INT NOT NULL
    GO

10

아래 쿼리로 시도하십시오.

ALTER TABLE MyTable
ADD MyNewColumn DataType DEFAULT DefaultValue

테이블에 새 열이 추가됩니다.


6
이 질문에 대한 다른 사용자가 제공 한 답변
janith1024

9
ALTER TABLE tbl_table ADD int_column int NOT NULL DEFAULT(0)

이 쿼리에서 기본값이 0 인 데이터 유형 정수 열을 추가 할 수 있습니다.


9

글쎄, 나는 지금 나의 이전 답변에 약간의 수정을 가졌다. 나는 어떤 대답도 언급되지 않았다는 것을 알아 차렸다 IF NOT EXISTS. 따라서 테이블을 변경하는 데 문제가 발생하여 새로운 솔루션을 제공하려고합니다.

IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.columns WHERE table_name = 'TaskSheet' AND column_name = 'IsBilledToClient')
BEGIN
ALTER TABLE dbo.TaskSheet ADD
 IsBilledToClient bit NOT NULL DEFAULT ((1))
END
GO

다음 TaskSheet은 특정 테이블 이름이며 IsBilledToClient삽입하려는 새 열과 1기본값입니다. 이는 새로운 열에서 기존 행의 값이 무엇인지를 의미하므로 자동으로 설정됩니다. 그러나 내가 사용한 것처럼 열 유형을 고려하여 원하는대로 변경할 수 있습니다BIT 있으므로 기본값 1을 입력합니다.

문제가 발생했기 때문에 위의 시스템을 제안합니다. 그래서 무엇이 문제입니까? 문제는 IsBilledToClient열이 테이블 테이블에 존재하는 경우 아래 코드의 일부만 실행하면 SQL Server 쿼리 빌더에 오류가 표시된다는 것입니다. 그러나 존재하지 않으면 처음으로 실행할 때 오류가 없습니다.

ALTER TABLE {TABLENAME}
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL}
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
[WITH VALUES]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.