Mssql not null 제약조건 추가 - mssql not null jeyagjogeon chuga

Mssql not null 제약조건 추가 - mssql not null jeyagjogeon chuga

제약 조건 ( Constraint )이란 데이터의 무결성을 지키기 위해 제한된(한) 조건을 말한다.

즉,  데이터를 삽입, 수정 등을 할 때 무조건 삽입하고 수정하는 것이 아니고 제한된 조건을 만족해야지만 삽입하고 수정하여 무결성을 지키는 것이다.

SQL Server에서 정의된 제약조건에는 아래와 같다.

  • Primary Key Constraint : PK 조건에 만족하는가?
  • Foreign Key Constraint : FK 조건에 만족하는가?
  • UNIQUE Constraint : 유니크한 Value인가?
  • CHECK Constraint : 체크로직에 만족하는가? (ex) Value > 100
  • DEFAULT Constraint : Default 값을 부여하는 제약조건.

● Primary Key Constraint

"PK 조건에 만족하는가?" 라고 설명을 했지만 흔하게 PK를 지정해준다라고 생각하면 된다.!

- 테이블 생성 시 제약조건 설정.

-- 테이블 생성 시 컬럼에 명시.
CREATE TABLE CONSTRAINT_TEST(
	SEQ INT NOT NULL CONSTRAINT PK_SEQ PRIMARY KEY
)

-- CONSTRAINT 구문 생략 가능.  제약조건 이름을 자동 설정한다.
CREATE TABLE CONSTRAINT_TEST(
	SEQ INT NOT NULL PRIMARY KEY
)

- 테이블에 제약조건 추가.

-- PK SEQ 제약조건 추가. ( INDEX DEFAULT : CLUSTERED INDEX )
ALTER TABLE CONSTRAINT_TEST
  ADD CONSTRAINT PK_SEQ PRIMARY KEY (SEQ)
  
-- PK 복합키 제약조건 추가. ( INDEX DEFAULT : CLUSTERED INDEX )
ALTER TABLE CONSTRAINT_TEST
  ADD CONSTRAINT PK_SEQ_ID PRIMARY KEY (SEQ, ID)
  
-- PK SEQ 제약조건 추가. ( INDEX : NONCLUSTERED INDEX )
ALTER TABLE CONSTRAINT_TEST
  ADD CONSTRAINT PK_SEQ PRIMARY KEY (SEQ) NONCLUSTERED

● Foreign Key Constraint

"FK조건에 만족하는가?" FK 외래 키를 설정한다고 생각하면 된다.

- 테이블 생성 시 제약조건 설정.

-- 테이블 생성 시 컬럼에 명시.
CREATE TABLE CONSTRAINT_TEST(
      SEQ INT NOT NULL CONSTRAINT PK_SEQ PRIMARY KEY
    , USER_NAME VARCHAR(100) NOT NULL 
                CONSTRAINT FK_USERNAME FOREIGN KEY REFERENCES USER_TBL(NAME)
)

-- CONSTRAINT 구문 생략 가능.  제약조건 이름을 자동 설정한다.
CREATE TABLE CONSTRAINT_TEST(
	SEQ INT NOT NULL PRIMARY KEY
    , USER_NAME VARCHAR(100) NOT NULL FOREIGN KEY REFERENCES USER_TBL(NAME)
)

- 테이블에 제약조건 추가.

-- FK USER_NAME 제약조건 추가. 
ALTER TABLE CONSTRAINT_TEST
  ADD CONSTRAINT FK_USERNAME FOREIGN KEY (USER_NAME) REFERENCES USER_TBL(NAME)
  
-- FK 복합키 제약조건 추가.
ALTER TABLE CONSTRAINT_TEST
  ADD CONSTRAINT FK_ID_USERNAME FOREIGN KEY (USER_ID, USER_NAME) REFERENCES USER_TBL(ID, NAME)

아래도 위 와 같다. 소스 코드만 명시하도록 하겠습니다.


● UNIQUE Constraint

- 테이블 생성 시 제약조건 설정.

CREATE TABLE Production.TransactionHistoryArchive4  
 (  
   TransactionID int NOT NULL,   
   CONSTRAINT AK_TransactionID UNIQUE(TransactionID)   
);

- 테이블에 제약조건 추가.

ALTER TABLE Person.Password   
ADD CONSTRAINT AK_Password UNIQUE (PasswordHash, PasswordSalt);

● CHECK Constraint

- 테이블에 제약조건 추가.

ALTER TABLE dbo.DocExc   
   ADD ColumnD int NULL   
   CONSTRAINT CHK_ColumnD_DocExc   
   CHECK (ColumnD > 10 AND ColumnD < 50);  
   
-- 정상케이스
INSERT INTO dbo.DocExc (ColumnD) VALUES (49);  

-- 비정상 케이스.
INSERT INTO dbo.DocExc (ColumnD) VALUES (55);

● DEFAULT Constraint

- 테이블 생성 시 제약조건 설정.

CREATE TABLE dbo.doc_exz (
     column_a INT,
     column_b INT DEFAULT 50
);
      
-- 제약사항 이름 정의.
CREATE TABLE dbo.doc_exz (
      column_a INT,
      column_b INT CONSTRAINT DF_Doc_Exz_Column_B DEFAULT 50
);

- 테이블에 제약조건 추가.

ALTER TABLE dbo.doc_exz
  ADD CONSTRAINT DF_Doc_Exz_Column_B
  DEFAULT 50 FOR column_b;

카테고리:

테이블, 뷰 및 시퀀스 DDL

이 항목에서는 CREATE TABLE 또는 ALTER TABLE 문에 CONSTRAINT 절을 지정하여 제약 조건을 만드는 방법에 대해 설명합니다.

  • 인라인 제약 조건은 개별 열 정의의 일부로 지정됩니다.

  • 아웃오브 라인 제약 조건은 독립된 절로 지정됩니다.

    • 테이블을 만들 때 이 절은 테이블에 대한 열 정의의 일부입니다.

    • 테이블을 변경할 때 이 절은 테이블에 대한 명시적인 ADD 작업으로 지정됩니다.

상세한 예를 포함한 자세한 내용은 제약 조건 을 참조하십시오.

이 항목의 내용:

구문¶

인라인 고유/기본/외래 키¶

CREATE TABLE <name> ( <col1_name> <col1_type>    [ NOT NULL ] { inlineUniquePK | inlineFK }
                     [ , <col2_name> <col2_type> [ NOT NULL ] { inlineUniquePK | inlineFK } ]
                     [ , ... ] )

ALTER TABLE <name> ADD COLUMN <col_name> <col_type> [ NOT NULL ] { inlineUniquePK | inlineFK }

여기서:

inlineUniquePK ::=
  [ CONSTRAINT <constraint_name> ]
  { UNIQUE | PRIMARY KEY }
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ ENABLE | DISABLE ]
  [ VALIDATE | NOVALIDATE ]
  [ RELY | NORELY ]

inlineFK :=
  [ CONSTRAINT <constraint_name> ]
  [ FOREIGN KEY ]
  REFERENCES <ref_table_name> [ ( <ref_col_name> ) ]
  [ MATCH { FULL | SIMPLE | PARTIAL } ]
  [ ON [ UPDATE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
       [ DELETE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ] ]
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ ENABLE | DISABLE ]
  [ VALIDATE | NOVALIDATE ]
  [ RELY | NORELY ]

아웃오브 라인 고유/기본/외래 키¶

CREATE TABLE <name> ... ( <col1_name> <col1_type>
                         [ , <col2_name> <col2_type> , ... ]
                         [ , { outoflineUniquePK | outoflineFK } ]
                         [ , { outoflineUniquePK | outoflineFK } ]
                         [ , ... ] )

ALTER TABLE <name> ... ADD { outoflineUniquePK | outoflineFK }

여기서:

outoflineUniquePK ::=
  [ CONSTRAINT <constraint_name> ]
  { UNIQUE | PRIMARY KEY } ( <col_name> [ , <col_name> , ... ] )
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ ENABLE | DISABLE ]
  [ VALIDATE | NOVALIDATE ]
  [ RELY | NORELY ]

outoflineFK :=
  [ CONSTRAINT <constraint_name> ]
  FOREIGN KEY ( <col_name> [ , <col_name> , ... ] )
  REFERENCES <ref_table_name> [ ( <ref_col_name> [ , <ref_col_name> , ... ] ) ]
  [ MATCH { FULL | SIMPLE | PARTIAL } ]
  [ ON [ UPDATE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
       [ DELETE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ] ]
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ ENABLE | DISABLE ]
  [ VALIDATE | NOVALIDATE ]
  [ RELY | NORELY ]

제약 조건 속성¶

다른 데이터베이스와의 호환성을 위해, Snowflake는 제약 조건 속성을 제공합니다. 제약 조건에 대해 지정할 수 있는 속성은 다음과 같이 유형에 따라 다릅니다.

  • 일부 속성은 모든 키(고유, 기본, 외래)에 적용됩니다.

  • 외래 키에만 적용되는 다른 속성도 있습니다.

중요

다른 데이터베이스에서 쉽게 마이그레이션할 수 있도록 이러한 속성이 제공됩니다. Snowflake에서는 이들 속성을 적용하거나 유지 관리하지 않습니다. 이는 이러한 속성의 기본값을 변경할 수 있지만, 기본값을 변경하면 Snowflake에서 제약 조건을 만들지 않게 된다는 뜻입니다.

자세한 내용은 제약 조건 속성 섹션을 참조하십시오.

(모든 키의) 속성¶

다음 제약 조건 속성은 모든 키에 적용됩니다(속성의 순서는 상호 교환 가능).

[ NOT ] ENFORCED
[ NOT ] DEFERRABLE
INITIALLY { DEFERRED | IMMEDIATE }
ENABLE | DISABLE
VALIDATE | NOVALIDATE
RELY | NORELY

  • ENFORCED | NOT ENFORCED 또는 ENABLE | DISABLE 이 지정되어 있을 때는 VALIDATE | NOVALIDATE 만 적용됩니다.

  • NOVALIDATE 가 지정되어 있을 때는 RELY | NORELY 만 적용됩니다.

  • 기본값:

    NOT ENFORCED DEFERRABLE INITIALLY DEFERRED ENABLE NOVALIDATE RELY

속성(외래 키만 해당)¶

다음 제약 조건 속성은 외래 키에만 적용됩니다(속성의 순서는 상호 교환 가능).

MATCH { FULL | SIMPLE | PARTIAL }
ON [ UPDATE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
   [ DELETE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]

  • MATCH ... 는 하나 이상의 열에 있는 NULL 값에 관해 외래 키 상수가 충족되는지 여부를 지정합니다.

  • ON ... 은 외래 키의 기본 키가 업데이트되거나 삭제될 때 수행되는 작업을 지정합니다.

  • 기본값:

    MATCH FULL UPDATE NO ACTION DELETE NO ACTION

사용법 노트¶

  • NOT NULL 은 열에 NULL 값이 허용되지 않음을 지정합니다.

    • 이것은 Snowflake에서 강제 적용하는 유일한 제약 조건입니다. 참조 무결성 제약 조건 섹션을 참조하십시오.

    • 열 정의 내에서 인라인 제약 조건으로만 지정할 수 있습니다.

    • 기본값은 열에 NULL 값을 허용하는 것입니다.

  • 다중 열 제약 조건(예: 복합 고유 키 또는 복합 기본 키)은 아웃오브 라인에서만 정의할 수 있습니다.

  • 인라인이나 아웃오브 라인으로 외래 키를 정의할 때, 외래 키 열과 참조된 테이블의 기본 키 열의 서명(즉, 이름과 데이터 타입)이 정확히 일치하는 경우 참조된 테이블의 열 이름을 지정할 필요가 없습니다.

  • 외래 키를 생성하는 경우 REFERENCES 절의 열은 기본 키에 대해 나열된 열과 동일한 순서로 나열되어야 합니다. 예:

    create table parent ... constraint primary_key_1 primary key (c_1, c_2) ...
    create table child  ... constraint foreign_key_1 foreign key (...) REFERENCES parent (c_1, c_2) ...
    

    두 경우 모두 열의 순서는 c_1, c_2 입니다. 외래 키의 열 순서가 달랐다면(예: c_2, c_1) 외래 키 생성 시도가 실패했을 것입니다.

예¶

아래 예에서는 테이블을 만드는 동안 간단한 NOT NULL 제약 조건을 만들고 테이블을 변경하는 동안 또 다른 NOT NULL 제약 조건을 만드는 방법을 보여줍니다.

테이블을 만드는 동시에 제약 조건 만들기:

CREATE TABLE table1 (
    col1 INTEGER NOT NULL
    );

제약 조건이 있는 열을 추가하도록 테이블 변경하기:

ALTER TABLE table1 
    ADD COLUMN col2 VARCHAR NOT NULL;

다음 예에서는 열의 의도가 고유한 값을 유지하는 것임을 지정하지만, 제약 조건이 실제로 적용되지 않음을 분명히 합니다. 이 예에서는 제약 조건의 이름(이 경우 《uniq_col3》)을 지정하는 방법도 설명합니다.

ALTER TABLE table1 
    ADD COLUMN col3 VARCHAR NOT NULL CONSTRAINT uniq_col3 UNIQUE NOT ENFORCED;

다음은 기본 키 제약 조건이 있는 부모 테이블과 첫 번째 테이블의 기본 키 제약 조건과 같은 열을 가리키는 외래 키 제약 조건이 있는 다른 테이블을 만드는 예입니다.

CREATE TABLE table2 (
    col1 INTEGER NOT NULL,
    col2 INTEGER NOT NULL,
    CONSTRAINT pkey_1 PRIMARY KEY (col1, col2) NOT ENFORCED
    );
CREATE TABLE table3 (
    col_a INTEGER NOT NULL,
    col_b INTEGER NOT NULL,
    CONSTRAINT fkey_1 FOREIGN KEY (col_a, col_b) REFERENCES table2 (col1, col2) NOT ENFORCED
    );