이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 5.5. 스포츠 토토 조건버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

5.3. 범퍼카 토토

데이터 유형은 테이블에 저장할 수 있는 데이터의 종류를 제한하는 방법입니다. 그러나 많은 응용 프로그램의 경우 제공되는 범퍼카 토토 조건이 너무 대략적입니다. 예를 들어 제품 가격이 포함된 열에는 양수 값만 허용되어야 합니다. 그러나 양수만 허용하는 표준 데이터 유형은 없습니다. 또 다른 문제는 다른 열이나 행과 관련하여 열 데이터를 제한하려고 할 수 있다는 것입니다. 예를 들어 제품 정보가 포함된 테이블에는 각 제품 번호에 대해 하나의 행만 있어야 합니다.

이를 위해 SQL을 사용하면 열과 테이블에 대한 범퍼카 토토 조건을 정의할 수 있습니다. 범퍼카 토토 조건을 사용하면 테이블의 데이터를 원하는 만큼 제어할 수 있습니다. 사용자가 범퍼카 토토 조건을 위반하는 열에 데이터를 저장하려고 하면 오류가 발생합니다. 이는 값이 기본값 정의에서 나온 경우에도 적용됩니다.

5.3.1. 범퍼카 토토 조건 확인

체크 범퍼카 토토은 가장 일반적인 범퍼카 토토 유형입니다. 이를 통해 특정 열의 값이 부울(진실 값) 표현식을 충족해야 함을 지정할 수 있습니다. 예를 들어 긍정적인 제품 가격을 요구하려면 다음을 사용할 수 있습니다.

테이블 제품 생성(
    product_no 정수,
    이름 텍스트,
    가격 숫자확인(가격  0)
);

보시다시피 범퍼카 토토 조건 정의는 기본값 정의와 마찬가지로 데이터 유형 뒤에 옵니다. 기본값과 범퍼카 토토 조건은 순서에 관계없이 나열될 수 있습니다. 검사 범퍼카 토토조건은 키워드로 구성됩니다.확인다음에 괄호 안의 표현식이 나옵니다. 검사 범퍼카 토토 조건 표현식은 이렇게 범퍼카 토토된 열을 포함해야 합니다. 그렇지 않으면 범퍼카 토토 조건이 그다지 의미가 없습니다.

또한 범퍼카 토토조건에 별도의 이름을 지정할 수 있습니다. 이렇게 하면 오류 메시지가 명확해지고 범퍼카 토토 조건을 변경해야 할 때 참조할 수 있습니다. 구문은 다음과 같습니다.

테이블 제품 생성(
    product_no 정수,
    이름 텍스트,
    가격 숫자CONSTRAINT positive_priceCHECK (가격  0)
);

따라서 명명된 범퍼카 토토 조건을 지정하려면 키워드를 사용하십시오.범퍼카 토토다음에는 식별자, 범퍼카 토토 조건 정의가 옵니다. (이런 방식으로 범퍼카 토토 조건 이름을 지정하지 않으면 시스템이 이름을 선택합니다.)

검사 범퍼카 토토 조건은 여러 열을 참조할 수도 있습니다. 정상 가격과 할인 가격을 저장하고 할인 가격이 정상 가격보다 낮은지 확인하고 싶다고 가정해 보겠습니다.

테이블 제품 생성(
    product_no 정수,
    이름 텍스트,
    가격 숫자 확인(가격  0),
    할인 가격 숫자 확인(할인 가격  0),CHECK (가격  할인_가격)
);

처음 두 범퍼카 토토 조건은 익숙해 보일 것입니다. 세 번째는 새로운 구문을 사용합니다. 특정 열에 첨부되지 않고 대신 쉼표로 구분된 열 목록에 별도의 항목으로 나타납니다. 열 정의와 이러한 범퍼카 토토 조건 정의는 혼합된 순서로 나열될 수 있습니다.

처음 두 범퍼카 토토 조건은 열 범퍼카 토토 조건이고 세 번째 범퍼카 토토 조건은 하나의 열 정의와 별도로 작성되므로 테이블 범퍼카 토토 조건이라고 합니다. 열 범퍼카 토토 조건은 테이블 범퍼카 토토 조건으로 작성할 수도 있지만 그 반대가 반드시 가능한 것은 아닙니다. 열 범퍼카 토토 조건은 자신이 연결된 열만 참조해야 하기 때문입니다. (PostgreSQL해당 규칙을 적용하지는 않지만 테이블 정의가 다른 데이터베이스 시스템과 작동하도록 하려면 이를 따라야 합니다.) 위의 예는 다음과 같이 작성할 수도 있습니다.

테이블 제품 생성(
    product_no 정수,
    이름 텍스트,
    가격 숫자,
    확인(가격  0),
    할인_가격 숫자,
    확인(할인_가격  0),
    확인(가격  할인_가격)
);

또는 심지어:

테이블 제품 생성(
    product_no 정수,
    이름 텍스트,
    가격 숫자 확인(가격  0),
    할인_가격 숫자,
    확인(할인_가격  0 AND 가격  할인_가격)
);

그것은 취향의 문제입니다.

열 범퍼카 토토과 동일한 방식으로 테이블 범퍼카 토토에 이름을 할당할 수 있습니다:

테이블 제품 생성(
    product_no 정수,
    이름 텍스트,
    가격 숫자,
    확인(가격  0),
    할인_가격 숫자,
    확인하세요(할인_가격  0),CONSTRAINT valid_discountCHECK (가격  할인_가격)
);

검사 표현식이 true 또는 null 값으로 평가되면 검사 범퍼카 토토 조건이 충족된다는 점에 유의해야 합니다. 대부분의 식은 피연산자가 null인 경우 null 값으로 평가되므로 제한된 열의 null 값을 방지하지 않습니다. 열에 null 값이 포함되지 않도록 하려면 다음 섹션에 설명된 null이 아닌 범퍼카 토토 조건을 사용할 수 있습니다.

참고

PostgreSQL지원하지 않음확인검사 중인 새 행 또는 업데이트된 행 이외의 테이블 데이터를 참조하는 범퍼카 토토 조건입니다. 동안확인이 규칙을 위반하는 범퍼카 토토 조건은 간단한 테스트에서 작동하는 것처럼 보일 수 있지만 (관련된 다른 행의 후속 변경으로 인해) 데이터베이스가 범퍼카 토토 조건이 거짓인 상태에 도달하지 않는다는 것을 보장할 수 없습니다. 이로 인해 데이터베이스 덤프 및 다시 로드가 실패하게 됩니다. 범퍼카 토토 조건을 충족하는 순서로 행이 로드되지 않기 때문에 전체 데이터베이스 상태가 범퍼카 토토 조건과 일치하는 경우에도 다시 로드가 실패할 수 있습니다. 가능하다면 다음을 사용하세요.고유, 제외또는외래 키교차 행 및 교차 테이블 제한을 표현하기 위한 범퍼카 토토 조건.

계속적으로 유지되는 일관성 보장보다는 행 삽입 시 다른 행에 대한 일회성 확인을 원하는 경우 사용자 정의젠 토토 : 문서 : 10 : 38 장. 트리거을 사용하여 이를 구현할 수 있습니다. (이 접근 방식은 덤프/다시 로드 문제를 방지합니다.pg_dump데이터를 다시 로드할 때까지 트리거를 다시 설치하지 않으므로 덤프/다시 로드 중에 검사가 시행되지 않습니다.)

참고

PostgreSQL그렇다고 가정합니다확인범퍼카 토토조건의 조건은 변경할 수 없습니다. 즉, 동일한 입력 행에 대해 항상 동일한 결과를 제공합니다. 이 가정은 조사를 정당화하는 것입니다.확인행이 삽입되거나 업데이트될 때만 제한되며 다른 시간에는 제한되지 않습니다. (다른 테이블 데이터를 참조하지 않는다는 위의 경고는 실제로 이 제한 사항의 특별한 경우입니다.)

이 가정을 깨는 일반적인 방법의 예는 다음에서 사용자 정의 함수를 참조하는 것입니다.확인식을 입력하고 해당 함수의 동작을 변경합니다.PostgreSQL이를 허용하지 않지만, 현재 테이블에 다음을 위반하는 행이 있는지는 알 수 없습니다.확인범퍼카 토토. 이로 인해 후속 데이터베이스 덤프 및 다시 로드가 실패하게 됩니다. 이러한 변경을 처리하는 데 권장되는 방법은 범퍼카 토토 조건을 삭제하는 것입니다(테이블 변경), 함수 정의를 조정하고 범퍼카 토토 조건을 다시 추가하여 모든 테이블 행에 대해 다시 확인합니다.

5.3.2. Null이 아닌 범퍼카 토토 조건

null이 아닌 범퍼카 토토 조건은 단순히 열이 null 값을 가정해서는 안 된다는 것을 지정합니다. 구문 예:

테이블 제품 생성(
    product_no 정수NULL이 아님,
    이름 텍스트NULL이 아님,
    가격 숫자
);

null이 아닌 범퍼카 토토조건은 항상 열 범퍼카 토토조건으로 기록됩니다. null이 아닌 범퍼카 토토 조건은 검사 범퍼카 토토 조건을 생성하는 것과 기능적으로 동일합니다.확인(컬럼_이름NULL이 아님), 하지만포스트그레SQLnull이 아닌 명시적인 범퍼카 토토 조건을 생성하는 것이 더 효율적입니다. 단점은 이런 방식으로 생성된 null이 아닌 범퍼카 토토 조건에 명시적인 이름을 지정할 수 없다는 것입니다.

물론, 열은 하나 이상의 범퍼카 토토조건을 가질 수 있습니다. 범퍼카 토토 조건을 하나씩 작성해 보세요.

테이블 제품 생성(
    product_no 정수는 NULL이 아닙니다.
    이름 텍스트는 NULL이 아닙니다.
    가격 숫자 NOT NULL 확인(가격  0)
);

순서는 중요하지 않습니다. 범퍼카 토토 조건을 확인하는 순서를 반드시 결정하는 것은 아닙니다.

NULL이 아님범퍼카 토토조건에는 반대가 있습니다: theNULL범퍼카 토토. 이는 열이 Null이어야 한다는 의미는 아니며 확실히 쓸모가 없습니다. 대신 이는 단순히 열이 null일 수 있는 기본 동작을 선택합니다.NULL범퍼카 토토조건은 SQL 표준에 존재하지 않으며 이식 가능한 애플리케이션에서 사용하면 안 됩니다. (다음에만 추가되었습니다.포스트그레SQL다른 데이터베이스 시스템과 호환됩니다.) 그러나 일부 사용자는 스크립트 파일의 범퍼카 토토 조건을 쉽게 전환할 수 있기 때문에 이를 좋아합니다. 예를 들어 다음과 같이 시작할 수 있습니다.

테이블 제품 생성(
    product_no 정수 NULL,
    이름 텍스트 NULL,
    가격 숫자 NULL
);

그리고 다음을 삽입하세요.아님원하는 키워드.

대부분의 데이터베이스 설계에서는 대부분의 열이 null이 아닌 것으로 표시되어야 합니다.

5.3.3. 고유 범퍼카 토토조건

고유 범퍼카 토토 조건은 열 또는 열 그룹에 포함된 데이터가 테이블의 모든 행에서 고유하도록 보장합니다. 구문은 다음과 같습니다.

테이블 제품 생성(
    product_no 정수고유,
    이름 텍스트,
    가격 숫자
);

열 범퍼카 토토 조건으로 작성된 경우 및:

테이블 제품 생성(
    product_no 정수,
    이름 텍스트,
    가격 숫자,고유(product_no)
);

테이블 범퍼카 토토조건으로 작성된 경우.

열 그룹에 대한 고유 범퍼카 토토 조건을 정의하려면 쉼표로 구분된 열 이름을 사용하여 테이블 범퍼카 토토 조건으로 작성하십시오.

테이블 생성 예(
    정수,
    b 정수,
    c 정수,고유 (a, c)
);

이는 표시된 열의 값 조합이 전체 테이블에서 고유함을 지정합니다. 그러나 열 중 어느 하나도 고유할 필요는 없으며 일반적으로 고유하지 않습니다.

일반적인 방법으로 고유 범퍼카 토토조건에 자신의 이름을 할당할 수 있습니다:

테이블 제품 생성(
    product_no 정수CONSTRAINT must_be_다른고유,
    이름 텍스트,
    가격 숫자
);

고유 범퍼카 토토 조건을 추가하면 범퍼카 토토 조건에 나열된 열 또는 열 그룹에 고유한 B-트리 인덱스가 자동으로 생성됩니다. 일부 행에만 적용되는 고유성 제한은 고유 범퍼카 토토 조건으로 작성할 수 없지만 고유한 범퍼카 토토 조건을 생성하여 이러한 제한을 적용할 수 있습니다.PostgreSQL : 문서 : 10 : 11.8. 배트맨 토토 색인.

일반적으로, 범퍼카 토토 조건에 포함된 모든 열의 값이 동일한 테이블에 하나 이상의 행이 있는 경우 고유 범퍼카 토토 조건을 위반합니다. 그러나 이 비교에서는 두 개의 Null 값이 동일한 것으로 간주되지 않습니다. 이는 고유 범퍼카 토토 조건이 있는 경우에도 제한된 열 중 하나 이상에 null 값을 포함하는 중복 행을 저장할 수 있음을 의미합니다. 이 동작은 SQL 표준을 따르지만 다른 SQL 데이터베이스에서는 이 규칙을 따르지 않을 수도 있다고 들었습니다. 따라서 이식 가능한 애플리케이션을 개발할 때는 주의하세요.

5.3.4. 기본 키

기본 키 범퍼카 토토 조건은 열 또는 열 그룹이 테이블 행의 고유 식별자로 사용될 수 있음을 나타냅니다. 이를 위해서는 값이 고유하고 null이 아니어야 합니다. 따라서 다음 두 테이블 정의는 동일한 데이터를 허용합니다.

테이블 제품 생성(
    product_no 정수 UNIQUE NOT NULL,
    이름 텍스트,
    가격 숫자
);
테이블 제품 생성(
    product_no 정수기본 키,
    이름 텍스트,
    가격 숫자
);

기본 키는 하나 이상의 열에 걸쳐 있을 수 있습니다. 구문은 고유 범퍼카 토토 조건과 유사합니다.

테이블 생성 예(
    정수,
    b 정수,
    c 정수,기본 키 (a, c)
);

기본 키를 추가하면 기본 키에 나열된 열 또는 열 그룹에 고유한 B-트리 인덱스가 자동으로 생성되고 해당 열이 강제로 표시됩니다.NULL이 아님.

테이블은 최대 하나의 기본 키를 가질 수 있습니다. (기능적으로는 거의 동일한 고유 범퍼카 토토 조건과 null이 아닌 범퍼카 토토 조건이 여러 개 있을 수 있지만 하나만 기본 키로 식별할 수 있습니다.) 관계형 데이터베이스 이론에서는 모든 테이블에 기본 키가 있어야 한다고 규정합니다. 이 규칙은 다음에 의해 시행되지 않습니다.PostgreSQL, 하지만 일반적으로 이를 따르는 것이 가장 좋습니다.

기본 키는 문서화 목적과 클라이언트 응용 프로그램 모두에 유용합니다. 예를 들어, 행 값 수정을 허용하는 GUI 애플리케이션은 행을 고유하게 식별할 수 있도록 테이블의 기본 키를 알아야 할 수 있습니다. 또한 데이터베이스 시스템이 기본 키가 선언된 경우 이를 사용하는 다양한 방법이 있습니다. 예를 들어 기본 키는 해당 테이블을 참조하는 외래 키에 대한 기본 대상 열을 정의합니다.

5.3.5. 외래 키

외래 키 범퍼카 토토 조건은 열(또는 열 그룹)의 값이 다른 테이블의 일부 행에 나타나는 값과 일치해야 함을 지정합니다. 우리는 이것이 다음을 유지한다고 말합니다.참조 무결성두 개의 관련 테이블 사이.

우리가 이미 여러 번 사용한 제품 테이블이 있다고 가정해 보겠습니다.

테이블 제품 생성(
    product_no 정수 기본 키,
    이름 텍스트,
    가격 숫자
);

또한 해당 제품의 주문을 저장하는 테이블이 있다고 가정해 봅시다. 우리는 주문 테이블에 실제로 존재하는 제품의 주문만 포함되도록 하려고 합니다. 따라서 제품 테이블을 참조하는 주문 테이블에 외래 키 범퍼카 토토 조건을 정의합니다.

테이블 주문 생성(
    order_id 정수 기본 키,
    product_no 정수REFERENCES 제품(product_no),
    수량 정수
);

이제 NULL이 아닌 주문을 생성하는 것은 불가능합니다product_no제품 테이블에 나타나지 않는 항목.

이 상황에서 우리는 주문 테이블이 다음과 같다고 말합니다.참조테이블과 제품 테이블은참조테이블. 마찬가지로 참조 열과 참조 열이 있습니다.

위 명령을 다음과 같이 단축할 수도 있습니다:

테이블 주문 생성(
    order_id 정수 기본 키,
    product_no 정수참조 제품,
    수량 정수
);

열 목록이 없으면 참조된 테이블의 기본 키가 참조된 열로 사용되기 때문입니다.

일반적인 방법으로 외래 키 범퍼카 토토 조건에 자신의 이름을 할당할 수 있습니다.

외래 키는 열 그룹을 제한하고 참조할 수도 있습니다. 평소와 같이 테이블 범퍼카 토토 조건 형식으로 작성해야 합니다. 다음은 인위적인 구문 예입니다.

테이블 t1 생성(
  정수 PRIMARY KEY,
  b 정수,
  c 정수,외래 키(b, c) 참조 other_table(c1, c2)
);

물론, 제한된 열의 수와 유형은 참조된 열의 수와 유형과 일치해야 합니다.

때때로 다음 목적에 유용합니다.다른 테이블외래 키 범퍼카 토토 조건은 동일한 테이블이어야 합니다. 이것은 a라고 불린다자기 참조외래 키. 예를 들어, 테이블의 행이 트리 구조의 노드를 나타내도록 하려면 다음과 같이 작성할 수 있습니다.

테이블 트리 생성(
    node_id 정수 기본 키,
    parent_id 정수 REFERENCES 트리,
    이름 텍스트,
    ...
);

최상위 노드에는 NULL이 있습니다부모_ID, 그러나 NULL이 아님부모_ID항목은 테이블의 유효한 행을 참조하도록 제한됩니다.

테이블에는 하나 이상의 외래 키 범퍼카 토토 조건이 있을 수 있습니다. 이는 테이블 간의 다대다 관계를 구현하는 데 사용됩니다. 제품 및 주문에 대한 테이블이 있지만 이제 하나의 주문에 여러 제품을 포함할 수 있도록 허용하려고 한다고 가정해 보겠습니다(위의 구조에서는 허용되지 않음). 다음 테이블 구조를 사용할 수 있습니다.

테이블 제품 생성(
    product_no 정수 기본 키,
    이름 텍스트,
    가격 숫자
);

CREATE TABLE 주문(
    order_id 정수 기본 키,
    배송_주소 텍스트,
    ...
);

CREATE TABLE 주문_항목(
    product_no 정수 REFERENCES 제품,
    order_id 정수 REFERENCES 주문,
    수량 정수,
    기본 키(제품_번호, 주문_ID)
);

기본 키가 마지막 테이블의 외래 키와 겹치는 것을 확인하세요.

우리는 외래 키가 어떤 제품과도 관련되지 않은 주문 생성을 허용하지 않는다는 것을 알고 있습니다. 하지만 해당 제품을 참조하는 주문이 생성된 후 제품이 제거되면 어떻게 될까요? SQL을 사용하면 이를 처리할 수도 있습니다. 직관적으로 몇 가지 옵션이 있습니다.

  • 참조된 제품 삭제 금지

  • 주문도 삭제

  • 다른 뭔가요?

이를 설명하기 위해 위의 다대다 관계 예시에서 다음 정책을 구현해 보겠습니다. 누군가 주문에서 여전히 참조하고 있는 제품을 제거하려는 경우(경유주문_항목), 우리는 이를 허용하지 않습니다. 누군가 주문을 삭제하면 주문 항목도 삭제됩니다.

테이블 제품 생성(
    product_no 정수 기본 키,
    이름 텍스트,
    가격 숫자
);

CREATE TABLE 주문(
    order_id 정수 기본 키,
    배송_주소 텍스트,
    ...
);

CREATE TABLE 주문_항목(
    product_no 정수 REFERENCES 제품제한 삭제 중,
    order_id 정수 REFERENCES 주문캐스케이드 삭제 중,
    수량 정수,
    기본 키(제품_번호, 주문_ID)
);

제한적인 삭제와 계단식 삭제가 가장 일반적인 두 가지 옵션입니다.제한참조된 행의 삭제를 방지합니다.조치 없음범퍼카 토토조건을 확인할 때 참조 행이 여전히 존재하는 경우 오류가 발생함을 의미합니다. 아무것도 지정하지 않은 경우 이는 기본 동작입니다. (이 두 선택 사이의 본질적인 차이점은 다음과 같습니다.조치 없음검사가 거래 후반까지 연기되도록 허용하는 반면제한그렇지 않습니다.)캐스케이드은 참조된 행이 삭제될 때 이를 참조하는 행도 자동으로 삭제되도록 지정합니다. 다른 두 가지 옵션이 있습니다:NULL로 설정그리고기본값으로 설정. 이로 인해 참조 행이 삭제될 때 참조 행의 참조 열이 각각 Null 또는 해당 기본값으로 설정됩니다. 이로 인해 범퍼카 토토 조건을 준수하지 않아도 된다는 점에 유의하세요. 예를 들어 작업이 다음을 지정하는 경우기본값으로 설정그러나 기본값은 외래 키 범퍼카 토토 조건을 충족하지 않으므로 작업이 실패합니다.

유사삭제 중또한 있습니다업데이트 중참조된 열이 변경(업데이트)될 때 호출됩니다. 가능한 조치는 동일합니다. 이 경우,캐스케이드참조 열의 업데이트된 값이 참조 행에 복사되어야 함을 의미합니다.

일반적으로 참조 행은 참조 열이 null인 경우 외래 키 범퍼카 토토 조건을 충족할 필요가 없습니다. 만일전체 일치이 외래 키 선언에 추가되면 참조 행은 모든 참조 열이 null인 경우에만 범퍼카 토토 조건을 충족하여 이스케이프됩니다. 따라서 null과 null이 아닌 값의 혼합은 실패할 것이 보장됩니다.전체 일치범퍼카 토토). 참조 행이 외래 키 범퍼카 토토 조건 충족을 피할 수 없도록 하려면 참조 열을 다음과 같이 선언하세요.NULL이 아님.

외래 키는 기본 키이거나 고유 범퍼카 토토 조건을 형성하는 열을 참조해야 합니다. 이는 참조된 열에는 항상 인덱스(기본 키 또는 고유 범퍼카 토토 조건의 기본 인덱스)가 있음을 의미합니다. 따라서 참조 행에 일치 항목이 있는지 확인하는 것이 효율적입니다. 이후삭제참조된 테이블의 행 또는업데이트35104_35465

데이터 업데이트 및 삭제에 대한 자세한 내용은 다음을 참조하세요.메이저 토토 사이트 : 문서 : 10 : 6 장 데이터 조작. 또한 참조 문서에서 외래 키 범퍼카 토토 조건 구문에 대한 설명을 참조하세요.테이블 생성.

5.3.6. 제외 범퍼카 토토사항

제외 범퍼카 토토 조건은 지정된 연산자를 사용하여 지정된 열이나 표현식에서 두 행을 비교하는 경우 이러한 연산자 비교 중 적어도 하나가 false 또는 null을 반환하도록 보장합니다. 구문은 다음과 같습니다.

테이블 서클 생성(
    c 원,
    요점을 사용하여 제외(c WITH &&)
);

또한 참조테이블 생성 ... 범퍼카 토토 조건 ... 제외자세한 내용은.

제외 범퍼카 토토 조건을 추가하면 범퍼카 토토 조건 선언에 지정된 유형의 인덱스가 자동으로 생성됩니다.