체크 제약 조건

Check constraint

체크 제약조건은 데이터베이스 테이블의 각 에 의해 충족되어야 하는 요건을 지정하는 SQL의 무결성 제약조건의 한 유형이다.제약조건은 술어임에 틀림없다.표의 단일 열 또는 여러 을 나타낼 수 있다.술어의 결과는 다음 중 하나가 될 수 있다.TRUE,FALSE, 또는UNKNOWN, NULL의 존재 여부에 따라 달라짐.술어가 다음을 평가하는 경우UNKNOWN그런 다음 제약 조건을 위반하지 않고 표에 행을 삽입하거나 업데이트할 수 있다.이것은 의 술어에 반한다.WHERE의 조항.SELECT, 또는UPDATE진술들null

예를 들어, 제품을 포함하는 표에서는 제품의 가격과 수량이 음이 아닌 값이 되도록 체크 제약조건을 추가할 수 있다.

PRESS >= 0
수량 >= 0

이러한 제약조건이 마련되지 않았다면 마이너스 가격(-$30)이나 수량(-3품목)을 가질 수 있었을 것이다.null

데이터베이스에서 데이터의 유효성을 확인하고 데이터 무결성을 제공하기 위해 제약 조건을 사용한다.만약 그것들이 데이터베이스 수준에서 사용된다면, 데이터베이스를 사용하는 애플리케이션들은, 애플리케이션 자체가 무효한 데이터를 받아들이더라도, 데이터가 무효가 되도록, 무효화된 데이터를 추가하거나 수정할 수 없을 것이다.null

정의

각 체크 제약 조건은 에서 정의되어야 한다.CREATE TABLE, 또는ALTER TABLE구문을 사용하는 문장:

CREATE TABLE_name (..., 제약 조건_name Check ( 술어 ) , ... )
ALTER TABLE_name ADD 제약 조건_name Check (용어 )

체크 제약 조건이 단일 열만 참조하는 경우, 열 정의의 일부로 제약 조건을 지정할 수 있다.null

CREATE TABLE_name (... column_name type ChECK ( 술어 ) , ... )

NULL 제약 조건 아님

A NOT NULL제약조건은 기능상 다음과 같은 점검 제약조건과 동일하며,IS NOT NULL술어:

점검(칼럼이 NULL이 아님)

일부 관계형 데이터베이스 관리 시스템은 다음과 같은 경우에 성능을 최적화할 수 있다.NOT NULL제약 조건 구문은 에 반대하여 사용된다.CHECK위에 주어진 제약 조건 구문.[1]

공통 제한사항

대부분의 데이터베이스 관리 시스템은 상수 및 결정론적 함수에 대한 액세스 권한은 있지만 다른 테이블의 데이터나 트랜잭션 격리 때문에 현재 트랜잭션에 보이지 않는 데이터에는 액세스하지 않고 단일 행으로 체크 제약 조건을 제한한다.null

그러한 제약조건은 실제로 테이블 체크 제약조건이 아니라 행 체크 제약조건이다.이러한 제약조건은 일반적으로 행이 직접 업데이트될 때(성능상의 이유로)에만 검증되고 종종 묵시적으로 구현되기 때문이다.INSERT, 또는UPDATE트리거, 무결성 제약은 이러한 제약이 없다면 간접 작용에 의해 위반될 수 있다.더욱이, 이러한 기록의 유효하지 않은 수정은 다음에 의해 방지될 것이다.CHECK제약을 가하다위험한 제약조건의 일부 예는 다음과 같다.

  • CHECK ((select count(*) from invoices where invoices.customerId = customerId) < 1000)
  • CHECK (dateInserted = CURRENT_DATE)
  • CHECK (countItems = RAND())

사용자 정의 트리거를 사용하여 이러한 제한사항을 해결할 수 있다.구현에서는 유사하지만, 테이블이 직접 수정되었을 때에만 트리거가 발사된다는 것은 의미론적으로 분명하며, 다른 테이블의 간접적이고 중요한 변경을 처리하는 것은 설계자의 책임이며, 다른 한편의 제약은 사용자의 행동이나 설계자의 행동과 무관하게 "항상 진실"이 되도록 의도한다.선견지명이 없는null

참조

  1. ^ PostgreSQL 13 설명서, 5장.데이터 정의, 섹션 5.4.2.Null이 아닌 제약 조건, 웹 사이트: https://www.postgresql.org/docs/13/ddl-constraints.html, 2021년 1월 9일 액세스