SQL Server의 열 추가 문에서 명명 된 기본 제약 조건을 만들 수 있습니까?


163

SQL Server에서 테이블에 새 열이 있습니다.

ALTER TABLE t_tableName 
    ADD newColumn NOT NULL

기본 제약 조건을 지정하지 않고 NOT NULL을 지정하기 때문에 실패합니다. 테이블에는 기본 제약 조건이 없어야합니다.

이 문제를 해결하기 위해 기본 제약 조건으로 테이블을 만든 다음 제거 할 수 있습니다.

그러나 기본 제약 조건을이 문의 일부로 지정해야한다고 지정할 수있는 방법이없는 것이므로이를 제거하는 유일한 방법은 sys.default_constraints에서 찾는 저장 프로 시저를 사용하는 것입니다. 표.

이것은 많은 일이 일어날 수있는 작업에 약간 혼란스럽고 장황합니다. 누구든지 이것에 대한 더 나은 해결책이 있습니까?

답변:


224

이것은 작동해야합니다 :

ALTER TABLE t_tableName 
    ADD newColumn VARCHAR(50)
    CONSTRAINT YourContraintName DEFAULT '' NOT NULL

1
2012 년에도 작동합니다. 자세한 내용 : msdn.microsoft.com/en-us/library/ms187742.aspx
adam77

10
NOT NULL데이터 유형에 인접을 두지 않겠습니까? 제약 조건 뒤에 넣는 것은 구문 상 유효 할 수 있지만 거기에 두는 것은 혼란스러워 보입니다.
Tullo_x86

102
ALTER TABLE t_tableName 
    ADD newColumn int NOT NULL
        CONSTRAINT DF_defaultvalue DEFAULT (1)

22
NOT NULL 제약 조건을 잃어 버릴 염려없이 기본 제약 조건을 삭제할 수 있으므로 허용 된 답변보다 선호합니다.
열한번째 의사

7
@EleventhDoctor 그건 말이되지 않습니다. NOT NULL은 제약 조건의 일부가 아니며 drop 문은 제약 조건 이름 만 참조합니다
Roger Willcocks

11
@RogerWillcocks 당신이 옳지 만 NOT NULL이 제약 조건과 분리되어 있다는 것이 더 명확합니다.
deluxxxe

10

기존 답변이 다소 얇기 때문에 세부 정보를 추가하고 싶습니다 .

가장 중요한 힌트는 다음과 같습니다. 명시적인 이름없이 제약 조건을 만들면 안됩니다!

명명되지 않은 제약 조건의 가장 큰 문제 : 다양한 고객 컴퓨터에서이를 실행할 때 각기 다른 / 임의의 이름 이 표시됩니다.
모든 미래 업그레이드 스크립트는 진짜 두통이 될 것입니다 ...

일반적인 조언은 다음과 같습니다.

  • 이름이없는 제약은 없습니다!
  • 몇 가지 명명 규칙을 사용하십시오.
    • DF_TableName_ColumnName 기본 제약 조건
    • CK_TableName_ColumnName 점검 제한 조건
    • UQ_TableName_ColumnName 독특한 제약
    • PK_TableName 기본 키 제약 조건

일반적인 구문은

TheColumn <DataType> Nullability CONSTRAINT ConstraintName <ConstraintType> <ConstraintDetails>

여기에 이것을보십시오

각 열에 제약 조건을 더 추가 할 수 있으며 쉼표 뒤에 열을 추가하는 것처럼 추가 제약 조건을 추가 할 수 있습니다.

CREATE TABLE dbo.SomeOtherTable(TheIdThere INT NOT NULL CONSTRAINT PK_SomeOtherTable PRIMARY KEY)
GO
CREATE TABLE dbo.TestTable
(
 --define the primary key
 ID INT IDENTITY NOT NULL CONSTRAINT PK_TestTable PRIMARY KEY

 --let the string be unique (results in a unique index implicitly)
,SomeUniqueString VARCHAR(100) NOT NULL CONSTRAINT UQ_TestTable_SomeUniqueString UNIQUE

 --define two constraints, one for a default value and one for a value check
,SomeNumber INT NULL CONSTRAINT DF_TestTable_SomeNumber DEFAULT (0)
                     CONSTRAINT CK_TestTable_SomeNumber_gt100 CHECK(SomeNumber>100)

 --add a foreign key constraint
,SomeFK INT NOT NULL CONSTRAINT FK_TestTable_SomeFK FOREIGN KEY REFERENCES dbo.SomeOtherTable(TheIdThere)

 --add a constraint for two columns separately
,CONSTRAINT UQ_TestTable_StringAndNumber UNIQUE(SomeFK,SomeNumber)
);
GO

-일부 데이터 삽입

INSERT INTO dbo.SomeOtherTable VALUES(1);
INSERT INTO dbo.TestTable(SomeUniqueString,SomeNumber,SomeFK) VALUES('hello',111,1);
GO
INSERT INTO dbo.TestTable(SomeUniqueString,SomeNumber,SomeFK) 
VALUES('fails due to uniqueness of 111,1',111,1);

1

아래 스크립트처럼 시도하십시오.

ALTER TABLE DEMO_TABLE
ADD Column1 INT CONSTRAINT Def_Column1 DEFAULT(3) NOT NULL,
    Column2 VARCHAR(10) CONSTRAINT Def_Column2 DEFAULT('New') NOT NULL;
GO
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.