기존 열의 기본값을 설정하는 방법


375

이것은 SQL Server 2008에서 작동하지 않습니다.

ALTER TABLE Employee ALTER COLUMN CityBorn SET DEFAULT 'SANDNES'

오류는 다음과 같습니다

키워드 'SET'근처의 구문이 잘못되었습니다.

내가 무엇을 잘못하고 있지?


1
MSDN ALTER TABLE에 대해 무엇을 읽었습니까? msdn.microsoft.com/ko-kr/library/ms187742(SQL.90).aspx
gbn



1
이것이 mysql 구문입니다.
Benjamin Goodacre

왜 모두가 표준에 충실 할 수 없습니까? (실제 질문은 아닙니다. 모두 Microsoft 및 mysql 또는 기타 공급 업체를 언급하는 사람). 이 작업을 수행하는 ansi / iso 표준 방법이 있습니까?
joedotnot

답변:


566

이것은 SQL Server에서 작동합니다.

ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;

62
제약 조건 이름을 지정하면 +1이므로 SQL Server는 임의 이름을 만들지 않습니다.
HardCode

36
MSSQL은 기본값 "제약"을 호출하는 데 이상합니다. 무엇이든, 그들은 휴식입니다 ; 제약 의 반대 ! 그들은 더 많은 것을 유효하게 만듭니다.
로마 Starkov

4
다음과 같은 대안으로 생각하면 이상하지 않습니다. 기본 제약 조건은 열을 지정하지 않으면 MSSQL이 오류를 발생시키지 않습니다. 따라서 사용자에게는 제약이 아니지만 MSSQL에는 제약이 있습니다.
Jonny Piazzi

4
열에 기존 기본 제약 조건이없는 경우에만 작동합니다.
pmcilreavy

4
@fallenidol 열에 기존의 기본 제약 조건이없는 경우에만 작동합니다. 정의상 당신은 하나 이상의 기본값을 가질 수 없기 때문에 ...
Yuck

165
ALTER TABLE Employee ADD DEFAULT 'SANDNES' FOR CityBorn

3
이것은 MSSQL에서 작동하지만 장면 뒤에서 생성하는 제약 조건의 이름을 지정하지 않는다는 단점이 있습니다 (위의 더 높은 투표 답변 참조).
Contango

10
@Contango 나는 당신이 그들 중 하나를 수정하는 데 필요한 모든 단일 제약 조건을 명명하는 것을 방해하지 않는 것이 더 좋다고 생각합니다. 그냥 쓰기 자동으로 이름 제약 조건을 삭제하기위한 과정을 그리고 당신은 다른 모든 익명의 사람과 거래를 할 수 다시 + 하나의 이름을 결코
JonnyRaa

3
@ 조니 리즈. 좋은 지적. 데이터베이스 스키마를 수정하거나 이해하려는 다른 사람들에게 좋은 문서이므로 제약 조건의 이름도 지정하고 싶습니다. 하나의 팀에서 일하는 솔로 운영자 인 경우 덜 중요합니다.
Contango

1
(EESH! 줄 바꿈이 부족하여 죄송합니다. 명확성을 위해 아래에 붙여 넣었습니다!) 다시 실행할 수 있어야하고 이미 완료되었는지 확인하기 위해이 방법을 찾았습니다 ... IF EXISTS (SELECT * FROM information_schema.columns WHERE table_name = 'myTable'AND column_name = 'myColumn'AND Table_schema = 'myDBO'및 column_default는 NULL) BEGIN ALTER TABLE [myDBO]. [myTable] [myColumn]에 대해 기본 0을 추가하십시오.
Dave

4
기본 제약 조건이 하나 밖에 없다면 왜 이름을 지정해야합니까? 다른 데이터베이스 엔진은 열 이름 이외의 다른 이름이없는 열의 기본값을 추가, 업데이트 및 제거하기위한 구문을 제공하는 것처럼 보입니다. 위의 코드는 기본값이 이미 존재하면 btw입니다. SQL Server에 기본 제약 조건의 이름을 식별하기 위해 시스템 테이블에 대한 복잡한 조인이 필요하다는 것은 우스운 일입니다. 열에는 기본 제약 조건이 하나만 있기 때문에 필요하지 않습니다.
Triynko

51

그것에 대해 alter column을 사용할 수 없으므로 대신 add를 사용하십시오.

ALTER TABLE Employee 
ADD DEFAULT('SANDNES') FOR CityBorn

9
왜이 답변이 공감되지 않는지 모릅니다. 그것은 이전의 것과 정확히 동일하고 이전에 답변되었습니다 ...
spankmaster79

30

이를 수행하는 올바른 방법은 다음과 같습니다.

  1. 다음 명령을 실행하십시오 :

    sp_help [table name] 
  2. 의 이름을 복사하십시오 CONSTRAINT.

  3. 드롭 DEFAULT CONSTRAINT:

    ALTER TABLE [table name] DROP [NAME OF CONSTRAINT] 
  4. 아래 명령을 실행하십시오.

    ALTER TABLE [table name] ADD DEFAULT [DEFAULT VALUE] FOR [NAME OF COLUMN]

4
StackOverflow.com은 영어로만 제공됩니다. 포르투갈어 사이트는 pt.stackoverflow.com
Martin Smith

이것은 다른 답변에 새로운 것을 추가하지 않고, 수동적 인 방법입니다 – 스크립트로 작성 될 수 없으며, "올바른 방법"으로 표시됩니다.
Andre Figueiredo

12

Hoodaticus의 솔루션은 완벽했습니다. 감사합니다. 그러나 다시 실행할 수 있어야하고 완료되었는지 확인하기 위해이 방법을 찾았습니다 ...

IF EXISTS(SELECT * FROM information_schema.columns 
           WHERE table_name='myTable' AND column_name='myColumn' 
             AND Table_schema='myDBO' AND column_default IS NULL) 
BEGIN 
  ALTER TABLE [myDBO].[myTable] ADD DEFAULT 0 FOR [myColumn] --Hoodaticus
END

7

열의 기본값을 변경할 수있는 두 가지 시나리오가 있습니다.

  1. 테이블 작성시
  2. 기존 테이블의 기존 열을 수정하십시오.

  1. 테이블을 만들거나 새 열을 만들 때.

질문

create table table_name
(
    column_name datatype default 'any default value'
);
  1. 기존 테이블의 기존 열 수정

이 경우 내 SQL 서버는 기존 기본 제약 조건 값을 수정할 수 없습니다. 따라서 기본값을 변경하려면 기존 시스템 생성 또는 사용자 생성 기본 제약 조건을 삭제해야합니다. 그런 다음 특정 열에 대해 기본값을 설정할 수 있습니다.

몇 가지 단계를 수행하십시오.

  1. 열에 대한 모든 기존 기본값 제한 조건을 나열하십시오.

이 시스템 데이터베이스 프로 시저를 실행하면 테이블 이름이 매개 변수로 사용됩니다. 테이블 내의 모든 열에 대한 모든 제약 조건의 목록을 반환합니다.

execute [dbo].[sp_helpconstraint] 'table_name'
  1. 열에 대한 기존 기본 제한 조건을 삭제하십시오.

통사론:

alter table 'table_name' drop constraint 'constraint_name'
  1. 해당 열에 새로운 기본값 제약 조건을 추가하십시오.

통사론:

alter table 'table_name' add default 'default_value' for 'column_name'

건배 @ !!!


5

기본 이름으로 제한이 이미 존재하는 경우 :

-- Drop existing default constraint on Employee.CityBorn
DECLARE @default_name varchar(256);
SELECT @default_name = [name] FROM sys.default_constraints WHERE parent_object_id=OBJECT_ID('Employee') AND COL_NAME(parent_object_id, parent_column_id)='CityBorn';
EXEC('ALTER TABLE Employee DROP CONSTRAINT ' + @default_name);

-- Add default constraint on Employee.CityBorn
ALTER TABLE Employee ADD CONSTRAINT df_employee_1 DEFAULT 'SANDNES' FOR CityBorn;

4
ALTER TABLE [dbo].[Employee] ADD  DEFAULT ('N') FOR [CityBorn]

4

다음 구문을 사용할 수 있습니다. 자세한 내용은이 질문과 답변을 참조하십시오 . 기본값이있는 열을 SQL Server의 기존 테이블에 추가

구문 :

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.

또 다른 방법 :

테이블을 마우스 오른쪽 버튼으로 클릭하고 디자인을 클릭 한 다음 기본값을 설정하려는 열을 클릭하십시오.

그런 다음 페이지 하단에 기본값 또는 바인딩을 추가하십시오 : 문자열의 경우 '1'또는 int의 경우 1과 같습니다.


3

이전에 null 인 기존 열을 변경하는 3 가지 간단한 단계를 찾았습니다.

update   orders
set BasicHours=0 where BasicHours is null

alter table orders 
add default(0) for BasicHours

alter table orders 
alter  column CleanBasicHours decimal(7,2) not null 

3

첫 번째 드롭 구속 조건

https://stackoverflow.com/a/49393045/2547164

DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS
WHERE PARENT_OBJECT_ID = OBJECT_ID('__TableName__')
AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns
                        WHERE NAME = N'__ColumnName__'
                        AND object_id = OBJECT_ID(N'__TableName__'))
IF @ConstraintName IS NOT NULL
EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)

두 번째 기본값 작성

ALTER TABLE [table name] ADD DEFAULT [default value] FOR [column name]

2

다음 명령을 시도하십시오.

ALTER TABLE Person11
ADD CONSTRAINT col_1_def
DEFAULT 'This is not NULL' FOR Address

1

Yuck의 대답처럼 스크립트를 오류없이 두 번 이상 실행할 수 있습니다. (info_schema.columns를 사용하는 것보다 코드 / 사용자 지정 문자열이 적음)

IF object_id('DF_SomeName', 'D') IS NULL BEGIN
    Print 'Creating Constraint DF_SomeName'
   ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;
END
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.