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

5.3. 제약 스포츠 토토

데이터 유형은 데이터 종류를 제한하는 방법입니다. 테이블에 저장됩니다. 그러나 많은 응용 분야의 경우 제약 스포츠 토토이 있습니다 그들은 너무 거칠다. 예를 들어, a 제품 가격은 아마도 긍정적 인 가치 만 받아야 할 것입니다. 하지만 양수 만 수용하는 표준 데이터 유형이 없습니다. 또 다른 문제는 열 데이터를 다른 열이나 행을 존중합니다. 예를 들어, 테이블에서 제품 정보가 포함되어 있으면 각 제품 번호.

이를 위해 SQL은 열에서 제약 스포츠 토토을 정의하고 테이블. 제약 스포츠 토토은 귀하에게 귀하의 데이터를 많이 제어 할 수 있습니다. 원하는대로 테이블. 사용자가 칼럼에 데이터를 저장하려는 경우 제약을 위반하면 오류가 발생합니다. 이것은 적용됩니다 값이 기본값 정의에서 나온 경우에도

5.3.1. 확인하다 제약 스포츠 토토

점검 제약 스포츠 토토이 가장 일반적인 제약 스포츠 토토 유형입니다. 그것 특정 열의 값이 부울 (진실 가치) 표현을 만족시킵니다. 예를 들어 긍정적 인 제품 가격이 필요하면 사용할 수 있습니다.

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

보시다시피, 제약 스포츠 토토 정의는 데이터 유형 이후에 발생합니다. 기본값 정의와 마찬가지로. 기본값 및 제약 어떤 순서로든 나열 할 수 있습니다. 점검 제약 스포츠 토토은 키로 구성됩니다 단어check괄호. 점검 제약 조건 표현식에는 다음과 같습니다 따라서 열은 제한되며, 그렇지 않으면 제약 조건이 만들어지지 않습니다 너무 많은 감각.

제약 조건에 별도의 이름을 줄 수도 있습니다. 이것은 명확합니다 오류 메시지 및 귀하가 할 때 제약 조건을 참조 할 수 있습니다. 변경해야합니다. 구문은 다음과 같습니다.

테이블 제품 생성 (
    product_no 정수,
    이름 텍스트,
    가격 숫자제약 긍정적 _price점검 (가격 0)
);

따라서 이름이 지정된 제약 스포츠 토토을 지정하려면 키워드를 사용하십시오제약그 뒤에 식별자가 뒤 따릅니다 제약 조건 정의. (제약 조건 이름을 지정하지 않는 경우 이렇게하면 시스템이 이름을 선택합니다.)

체크 제약 조건은 여러 열을 참조 할 수도 있습니다. 말해봐 일반 가격과 할인 된 가격을 저장하면 할인 된 가격이 일반보다 낮은지 확인하십시오. 가격:

테이블 제품 생성 (
    product_no 정수,
    이름 텍스트,
    가격 숫자 점검 (가격 0),
    할인 된 숫자 숫자 점검 (할인 된 _price 0),check (가격 할인 _price));

처음 두 가지 제약 조건은 익숙해 보일 것입니다. 세 번째 새로운 구문을 사용합니다. 특정 열에 첨부되지 않으며 대신 쉼표로 구분 된 열에서 별도의 항목으로 나타납니다. 목록. 열 정의 및 이러한 제약 조건 정의는 가능합니다 혼합 순서로 등재.

우리는 처음 두 가지 제약 조건이 열 제약이라고 말합니다. 세 번째는 쓰기 되었기 때문에 테이블 제약 조건입니다. 하나의 열 정의와 별도로. 열 제약 조건이 가능합니다 또한 테이블 제약으로 작성되지만 반대는 아닙니다. 열 제약 조건이 예상되기 때문에 반드시 가능합니다 첨부 된 열만 참조하십시오. (PostgreSQL그 규칙을 시행하지는 않지만 당신 테이블 정의와 함께 작업하려면 따라야합니다. 다른 데이터베이스 시스템.) 위의 예는 또한 작성 될 수 있습니다. 처럼:

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

또는 심지어 :

테이블 제품 생성 (
    product_no 정수,
    이름 텍스트,
    가격 숫자 점검 (가격 0),
    할인 된 숫자 숫자,
    Check (할인 된 _price 0 및 가격 할인 _price)
);

맛의 문제입니다.

이름을 테이블 제약 조건에 할당 할 수 있습니다. 열 제약 조건 :

테이블 제품 생성 (
    product_no 정수,
    이름 텍스트,
    가격 숫자,
    확인 (가격 0),
    할인 된 숫자 숫자,
    Check (할인 된 _price 0),제약 조건 valid_discount점검 (가격 할인 _price)
);

It should be noted that a check constraint is satisfied if the check expression evaluates to true or the null value. Since most expressions will evaluate to the null value if any operand is null, they will not prevent null values in the constrained columns. To ensure that a column does not contain null values, the not-null constraint described in the next section can be used.

5.3.2. 무감각합니다 제약 조건

NOT NULL 제약 조건은 단순히 열이 안된다고 지정합니다. 널 값을 가정하십시오. 구문 예 :

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

NOT NULL 제약 조건은 항상 열 제약 조건으로 작성됩니다. 널없는 제약 조건은 기능적으로 a를 생성하는 것과 동일합니다 제약 조건 확인check (column_namein is null)하지만PostgreSQL명시 적 만들기 널없는 제약 조건이 더 효율적입니다. 단점은 당신입니다 이를 만들어 내지 않은 제약 조건에 명시적인 이름을 줄 수는 없습니다 방법.

물론 열에는 둘 이상의 제약 조건을 가질 수 있습니다. 단지 제약 조건을 차례로 작성하십시오 :

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

주문은 중요하지 않습니다. 반드시 결정되는 것은 아닙니다 제약 조건이 점검됩니다.

theNOT NULL제약 조건은 반대입니다. 그만큼NULL제약. 이것은 의미가 아닙니다 열은 널이어야한다는 것은 반드시 쓸모가 없을 것입니다. 대신, 이것은 단순히 열의 기본 동작을 선택합니다. 무일 주의자 일 수 있습니다. 그만큼NULL제약 조건은 아닙니다 SQL 표준에 존재하며 휴대용으로 사용해서는 안됩니다. 응용 프로그램. (에만 추가되었습니다postgresql다른 것과 호환됩니다 데이터베이스 시스템.) 그러나 일부 사용자는 그것을 만들기 때문에 좋아합니다. 스크립트 파일에서 제약 조건을 쉽게 전환 할 수 있습니다. 예를 들어, 당신 시작할 수 있습니다 :

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

다음not키워드 원하는.

팁 :대부분의 데이터베이스에서는 대부분의 열을 설계합니다 널 표시되지 않아야합니다.

5.3.3. 고유한 제약 조건

고유 한 제약 조건은 열에 포함 된 데이터가 또는 열의 그룹은 테이블의 모든 행에서 독특합니다. 구문은 다음과 같습니다.

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

열 제약 조건으로 작성된 경우 :

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

테이블 제약으로 작성 될 때.

열 그룹에 대한 고유 한 제약 조건을 정의하려면 작성하십시오. 열 이름이 분리 된 테이블 제약으로 쉼표 :

테이블 작성 예제 (
    정수,
    B 정수,
    C 정수,고유 (A, C));

이것은 표시된 값의 조합을 지정합니다. 열은 전체 테이블에서 독특하지만 열은 고유 할 필요가 없습니다.

당신은 고유 한 제약 조건에 대해 자신의 이름을 할당 할 수 있습니다. 일반적인 방법 :

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

고유 한 제약 조건을 추가하면 자동으로 고유 한 것이 생성됩니다 열 또는 열에 나열된 열의 B- 트리 색인 강제. 일부 행만 포괄하는 독창성 제한은 할 수 없습니다 독특한 제약으로 작성되지만 시행 할 수 있습니다. 고유 한 제한부분 색인.

일반적으로 더 많은 경우 고유 한 제약 조건이 위반됩니다. 모든 열의 값이있는 테이블의 한 줄보다 제약 조건에 포함 된 것은 동일합니다. 그러나 두 가지 널 값이 있습니다 이 비교에서는 동등한 것으로 간주되지 않습니다. 그것은조차도 의미합니다 독특한 제약 조건의 존재 중복을 저장할 수 있습니다. 제한된 것 중 하나 이상에서 널 값을 포함하는 행 열. 이 동작은 SQL 표준을 준수하지만 우리는 다른 SQL 데이터베이스 가이 규칙을 따르지 않을 수 있다고 들었습니다. 그래서 의도 된 응용 프로그램을 개발할 때주의하십시오 가지고 다닐 수 있는.

5.3.4. 기본 키

기본 키 제약 조건은 열 또는 그룹을 나타냅니다. 열은 테이블의 행에 고유 식별자로 사용할 수 있습니다. 이를 위해서는 값이 독특하고 무효가되지 않아야합니다. 그래서, 두 가지 테이블 정의 다음과 같은 데이터를 수락합니다.

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

기본 키는 둘 이상의 열에 걸쳐있을 수 있습니다. 구문은입니다 고유 한 제약과 유사 :

테이블 작성 예제 (
    정수,
    B 정수,
    C 정수,PRIMARY KEY (a, c));

기본 키를 추가하면 고유 한 B- 트리가 자동으로 생성됩니다. 기본 키에 나열된 열 또는 열 그룹의 색인, 그리고 칼럼이 표시되도록 강요 할 것입니다.

테이블에는 최대 하나의 기본 키가있을 수 있습니다. (어떤 것도있을 수 있습니다 기능적으로 인 독특하고 무형 제약 조건의 수 거의 같은 것이지만 하나만 기본 키.) 관계형 데이터베이스 이론은 모든 표를 지시합니다 기본 키가 있어야합니다. 이 규칙은에 의해 시행되지 않습니다.PostgreSQL이지만 일반적으로 따라하는 것이 가장 좋습니다 그것.

기본 키는 문서화 목적과 클라이언트 응용 프로그램. 예를 들어, 허용하는 GUI 응용 프로그램 행 값 수정은 아마도 행을 고유하게 식별 할 수있는 테이블. 다양한도 있습니다 데이터베이스 시스템이 기본 키를 사용하는 방법 선언되었다; 예를 들어 기본 키는 기본값을 정의합니다 테이블을 참조하는 외국 키의 대상 열 (들).

5.3.5. 외국 키

외국 키 제약 조건은 열의 값을 지정합니다. (또는 열 그룹)은 어떤 행에 나타나는 값과 일치해야합니다. 다른 테이블의. 우리는 이것이를 유지한다고 말합니다.참조 무결성두 관련 테이블.

여러 번 사용한 제품 테이블이 있다고 말합니다. 이미:

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

그 주문을 저장하는 테이블이 있다고 가정하자 제품. 주문 테이블에만 포함되도록하고 싶습니다. 실제로 존재하는 제품의 순서. 그래서 우리는 외국 키를 정의합니다 제품을 참조하는 주문 테이블의 제약 테이블:

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

이제 NULL이없는 주문을 만드는 것은 불가능합니다product_no제품 테이블.

우리는이 상황에서 주문 테이블이라고 말합니다.참조table and the products table is the참조테이블. 마찬가지로, 또한 있습니다 참조 및 참조 열.

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

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

열 목록이 없기 때문에 참조 테이블은 참조 열로 사용됩니다.

외국 키는 또한 그룹을 제한하고 참조 할 수 있습니다. 열. 평소와 같이 테이블 제약으로 작성해야합니다. 형태. 다음은 고안 구문 예입니다.

테이블 생성 t1 (
  정수 기본 키,
  B 정수,
  C 정수,FOREIGN KEY (b, c) REFERENCES other_table (c1, c2));

물론 제한된 열의 수와 유형이 필요합니다. 참조 된 열의 숫자와 유형에 맞추기 위해.

외국 키 제약 조건에 대한 자신의 이름을 할당 할 수 있습니다. 일반적인 방법.

테이블은 둘 이상의 외국 키 제약 조건을 가질 수 있습니다. 이것은 테이블 사이의 다수의 관계를 구현하는 데 사용됩니다. 말하다 제품 및 주문에 대한 테이블이 있지만 이제 하나의 주문이 가능한 많은 제품을 포함하도록 허용합니다 ( 위의 구조는 허용되지 않았습니다). 이 테이블을 사용할 수 있습니다 구조:

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

테이블 주문 생성 (
    Order_id 정수 기본 키,
    Shipping_Address 텍스트,
    ...
);

테이블 작성 order_items (
    product_no 정수 참조 제품,
    Order_id 정수 참조 주문,
    수량 정수,
    기본 키 (Product_No, Order_id)
);

기본 키가 외래 키와 겹치는 것을 주목하십시오. 마지막 테이블.

우리는 외국 열쇠가 명령을 만들지 않는다는 것을 알고 있습니다. 제품과 관련이 없습니다. 그러나 제품이 제거되면 어떻게해야합니까? 주문을 작성한 후에는? SQL을 사용하면 허용됩니다 그것을 처리하십시오. 직관적으로, 우리는 몇 가지 옵션이 있습니다 :

  • 참조 된 제품 삭제 허용

  • 주문 삭제

  • 다른 것?

이를 설명하려면 다음에 대한 다음 정책을 구현합시다. 위의 다수의 관계 예 : 누군가가 원할 때 주문으로 여전히 참조되는 제품을 제거하십시오 (viaOrder_Items), 우리는 그것을 허용하지 않습니다. 누군가 주문을 제거하고 주문 항목도 제거됩니다.

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

테이블 주문 생성 (
    Order_id 정수 기본 키,
    Shipping_Address 텍스트,
    ...
);

테이블 작성 order_items (
    product_no 정수 참조 제품ON DELETE 제한,
    Order_id 정수 참조 주문ON DELETE CASCADE,
    수량 정수,
    기본 키 (Product_No, Order_id)
);

제한 및 계단식 삭제가 가장 일반적입니다 옵션.제한prevents deletion of a referenced row.행동 없음IF를 의미합니다 제약 조건을 확인할 때 참조 행이 여전히 존재합니다. 오류가 제기됩니다. 지정하지 않는 경우 기본 동작입니다. 아무것. (이 두 가지 선택의 필수 차이는입니다 저것행동 없음수표를 허용합니다 거래 후반까지 연기되는 반면제한그렇지 않습니다.)캐스케이드참조 행이 삭제 될 때 행 참조를 지정합니다. 자동으로 삭제해야합니다. 다른 두 가지가 있습니다 옵션 :SET NULLand기본값 설정. 이로 인해 참조 열이 원인이됩니다. 참조 행 (들)에서 nulls 또는 그 기본값으로 설정됩니다. 참조 행이 삭제 될 때 각각 값. 주목하십시오 이들은 제약을 관찰하는 것을 실례하지 않습니다. 을 위한 예, 행동이 지정하는 경우세트 기본그러나 기본값은 외국을 만족시키지 않습니다 주요 제약 조건, 작동이 실패합니다.

유사성ON DELETE또한on updatea 참조 열이 변경되었습니다 (업데이트). 가능한 조치는입니다 동일합니다. 이 경우캐스케이드참조 열의 업데이트 된 값을 복사해야합니다. 참조 행으로 (들)

일반적으로 참조 행은 외국 키를 만족시킬 필요가 없습니다. 제약 조건 참조 열이 무인 상태 인 경우 제약. 만약에MATCH FULL외국 키에 추가됩니다 선언, 제약 조건을 만족하는 참조 행이 탈출합니다 모든 참조 열이 Null 인 경우에만 널이 아닌 값은 실패로 보장됩니다일치 가득한제약 조건). 행을 참조하고 싶지 않다면 외국의 주요 제약 조건을 만족시키지 못하고 참조 열 (들)으로NOT NULL.

외국 키는 기본 인 열을 참조해야합니다. 키 또는 고유 한 제약 조건을 형성합니다. 이것은 참조를 의미합니다 열에는 항상 인덱스가 있습니다 (기본 키 기본 또는 기본 키 또는 독특한 제약 조건); 따라서 참조 행에 a가 있는지 확인합니다 일치는 효율적입니다. A 이후로삭제OF 참조 테이블 또는 an의 행업데이트참조 열의 스캔이 필요합니다 이전 값과 일치하는 행에 대한 참조 테이블은 종종 참조 열을 색인화하는 것이 좋습니다. 이것이 이르기 때문입니다 항상 필요한 것은 아니며 방법에 대한 많은 선택이 있습니다. 색인, 외국 키 제약 조건의 선언은 그렇지 않습니다 참조 열에서 인덱스를 자동으로 만듭니다.

데이터 업데이트 및 삭제에 대한 자세한 정보는6 장. 외국 키에 대한 설명도 참조하십시오 참조 문서의 구속 구문테이블 만들기.

5.3.6. 제외 제약

제외 제약 조건 두 줄이 비교되면 지정된 열 또는 표현을 사용하여 연산자, 이러한 운영자 비교 중 하나 이상이 반환됩니다. 거짓 또는 널. 구문은 다음과 같습니다.

CREATE TABLE circles (
    C 서클,
    GIST 사용 (& with &&) 제외
);

참조테이블 생성 ... 제약 ... 제외세부.

제외 제약 조건을 추가하면 자동으로 an이 생성됩니다 제약 조건 선언에 지정된 유형의 색인