programing

SQL Server의 add column 문에 명명된 기본 제약 조건을 만들 수 있습니까?

lastcode 2023. 4. 7. 21:27
반응형

SQL Server의 add column 문에 명명된 기본 제약 조건을 만들 수 있습니까?

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

ALTER TABLE t_tableName 
    ADD newColumn NOT NULL

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

이를 피하기 위해 기본 구속조건으로 테이블을 만든 후 삭제할 수 있습니다.

그러나 기본 제약 조건을 이 문장의 일부로 지정할 수 있는 방법은 없는 것 같습니다.따라서 이 이름을 삭제하는 유일한 방법은 sys.default_constraints 테이블에서 검색되는 저장 프로시저를 갖는 것입니다.

이것은 자주 발생할 수 있는 수술치고는 좀 지저분하고 과장된 표현입니다.이에 대한 더 나은 해결책을 가진 사람이 있나요?

이 조작은 유효합니다.

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

몇 가지 세부사항을 추가하고 싶습니다.

가장 중요한 힌트는: 명시적인 이름 없이는 절대 제약조건을 만들지 말아야 한다는 것입니다.

이름 없는 제약 조건의 가장 큰 문제는 다음과 같습니다.다양한 고객 머신에서 이 작업을 실행하면 각 머신에 다른 이름/랜덤 이름이 표시됩니다.
향후 업그레이드 스크립트는 정말 골칫거리가 될 것입니다.

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

  • 이름 없는 제약은 없습니다!
  • 일부 명명 규칙을 사용합니다(예:
    • 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);

아래 스크립트처럼 시도해 보세요.

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

새 열을 추가할 때 다음을 사용하고 큰 테이블에 기본값으로 사용합니다.각 행을 개별적으로 실행합니다.

ALTER TABLE dbo.[TableName] ADD [ColumnName] BIT NULL; /*null>no table rebuild*/

UPDATE rf SET rf.[ColumnName] = 0 FROM dbo.[TableName] rf WHERE rf.[ColumnName] IS NULL;

ALTER TABLE dbo.[TableName] ALTER COLUMN [ColumnName] BIT NOT NULL;

ALTER TABLE dbo.[TableName] ADD CONSTRAINT DF_[TableName]_[ColumnName] DEFAULT 0 FOR [ColumnName];

언급URL : https://stackoverflow.com/questions/3770015/can-i-create-a-named-default-constraint-in-an-add-column-statement-in-sql-server

반응형