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

5.4. 토토 베이 조건

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

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

5.4.1. 확인하다 토토 베이 조건

체크 토토 베이 조건이 가장 일반적인 토토 베이 조건 유형입니다. 그것 특정 열의 값이 임의의 표현을 만족시킵니다. 예를 들어, 필요합니다 긍정적 인 제품 가격, 당신은 사용할 수 있습니다 :

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

보시다시피, 토토 베이 조건 정의는 데이터 뒤에옵니다. 기본값 정의와 마찬가지로 유형. 기본값 및 토토 베이 조건은 어떤 순서로든 나열 될 수 있습니다. 점검 토토 베이 핵심 단어로 구성check괄호 안의 표현식이 뒤 따릅니다. 점검 토토 베이 표현식은 따라서 제한된 열을 포함해야합니다. 그렇지 않으면 토토 베이이 너무 많이 만들지 않을 것입니다 감각.

토토 베이 조건에 별도의 이름을 줄 수도 있습니다. 이것 오류 메시지를 명확히하고 변경해야 할 때 제약. 구문은 다음과 같습니다.

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

따라서 이름이 지정된 토토 베이 조건을 지정하려면 키워드를 사용하십시오토토 베이 조건그 뒤에 식별자가 뒤 따릅니다 토토 베이 조건이 뒤 따릅니다.

검사 토토 베이 조건은 여러 열을 참조 할 수도 있습니다. 말하다 당신은 일반 가격과 할인 된 가격을 저장하고 할인 된 가격이 일반보다 낮은지 확인하기 위해 가격.

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

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

우리는 처음 두 가지 제약이 열이라고 말합니다 토토 베이 조건, 세 번째는 테이블 토토 베이 조건입니다 열 정의와 별도로 기록되기 때문입니다. 열 토토 베이 조건은 테이블 토토 베이 조건으로 서면으로 작성할 수 있으며 반대 반대가 가능하지는 않지만 반드시 가능하지는 않습니다. 위 예제도로 쓸 수 있습니다.

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

또는 짝수

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

맛의 문제입니다.

점검 제약이 충족된다는 점에 유의해야합니다. 점검 표현식은 true 또는 null 값으로 평가됩니다. 부터 대부분의 표현식은 하나의 피연산자 인 경우 널 값으로 평가됩니다. 널, 그들은 제한된 값에서 널 값을 방지하지 않습니다. 열. 열에 널 값이 포함되지 않도록 다음 섹션에 설명 된 널없는 토토 베이 조건은 사용된.

5.4.2. 널없는 토토 베이

NOT NULL 토토 베이 조건은 단순히 열이 필요하다는 것을 지정합니다 널 값을 가정하지 마십시오. 구문 예 :

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

무자비한 토토 베이 조건은 항상 열로 작성됩니다 강제. 널없는 토토 베이 조건은 기능적으로 동일합니다 체크 제약 만들기점검 (column_namein is null), 그러나에서PostgreSQL생성 명백한 널없는 토토 베이 조건이 더 효율적입니다. 단점은입니다 당신은 널없는 토토 베이 조건에 명시적인 이름을 줄 수 없다는 것입니다 그런 식으로 만들어졌습니다.

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

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

주문은 중요하지 않습니다. 반드시 결정되는 것은 아닙니다 토토 베이 조건을 순서대로 확인합니다.

theNOT NULL토토 베이 조건이 있습니다 역 반대 :NULL토토 베이. 이것 열이 null이어야한다는 것을 의미하지는 않습니다. 쓸모 없다. 대신, 이것은 단순히 기본 동작을 정의합니다 열이 무일하게 될 수 있습니다. 그만큼NULL토토 베이 조건은 SQL 표준에 정의되어 있지 않으며 휴대용 응용 프로그램에 사용됩니다. (에만 추가되었습니다PostgreSQL호환됩니다 다른 데이터베이스 시스템과 함께.) 그러나 일부 사용자는 좋아합니다. 스크립트에서 토토 베이 조건을 쉽게 전환 할 수 있기 때문입니다. 파일. 예를 들어부터 시작할 수 있습니다.

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

다음not키 단어 원하는 곳.

팁 :대부분의 데이터베이스 디자인에서 대부분의 경우 열은 널 표시되지 않아야합니다.

5.4.3. 고유한 토토 베이 조건

고유 한 토토 베이 조건은 a 열 또는 열 그룹은 모든 것에 대해 고유합니다. 테이블의 줄. 구문은

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

열 토토 베이으로 작성된 경우

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

테이블 토토 베이으로 작성 될 때.

고유 한 토토 베이 조건이 열 그룹을 나타내면 열은 쉼표로 분리되어 있습니다 :

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

고유 한 이름을 할당 할 수도 있습니다 토토 베이 조건 :

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

일반적으로 고유 한 토토 베이 조건이있을 때 위반됩니다. (적어도) 각각의 값이있는 테이블에서 두 줄 토토 베이 조건의 일부인 해당 열은 동일한. 그러나 널 값은 이것에서 동일하게 간주되지 않습니다 고려 사항. 그것은 독특한 존재하더라도 의미합니다 제한 제한 무제한 수의 행을 저장할 수 있습니다. 제한된 것 중 하나 이상에 널 값이 포함되어 있습니다. 열. 이 동작은 SQL 표준을 준수하지만 우리는 우리입니다 다른 SQL 데이터베이스 가이 규칙을 따르지 않을 수 있다고 들었습니다. 따라서 의도 된 응용 프로그램을 개발할 때주의하십시오. 휴대 가능.

5.4.4. 주요한 키

기술적으로, 주요 주요 제약은 단순히 a입니다 독특한 토토 베이 조건과 무감각 한 토토 베이 조건의 조합. 따라서 다음 두 테이블 정의는 동일하게 받아들입니다 데이터:

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

기본 키는 둘 이상의 열을 제한 할 수 있습니다. 그만큼 구문은 고유 한 제약과 유사합니다.

테이블 작성 예제 (
    정수,
    B 정수,
    C 정수,기본 키 (A, C));

기본 키는 열 또는 열 그룹이 테이블의 행에 고유 식별자로 사용할 수 있습니다. (이것 기본 키 정의의 직접적인 결과입니다. 고유 한 토토 베이 조건 자체는 널 값을 제외하지 않기 때문에 고유 식별자.) 이것은 문서화 목적과 클라이언트 모두에 유용합니다. 응용 프로그램. 예를 들어, 허용하는 GUI 응용 프로그램 행 값을 수정하면 아마도 기본 키를 알아야합니다. 행을 독창적으로 식별 할 수있는 테이블.

테이블은 최대 하나의 주요 키를 가질 수 있습니다 ( 많은 독특하고 무감각 한 토토 베이 조건). 관계형 데이터베이스 이론은 모든 테이블에 기본 키가 있어야한다고 지시합니다. 이것 규칙은에 의해 시행되지 않습니다postgresql이지만 일반적으로 가장 좋습니다 따르십시오.

5.4.5. 외국 키

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

우리가 몇 가지를 사용한 제품 테이블이 있다고 말합니다. 이미 시간 :

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

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

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

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

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

위의 명령을로 단축 할 수도 있습니다.

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

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

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

테이블 생성 t1 (
  정수 기본 키,
  B 정수,
  C 정수,외국 키 (B, C) 참조 기타 _table (C1, C2));

물론 제한된 열의 수와 유형 참조 된 수와 유형을 일치시켜야합니다. 열.

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

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

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

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

기본 키는 외국과 겹칩니다. 마지막 테이블의 키.

우리는 외국 열쇠가 명령 생성을 허용하지 않는다는 것을 알고 있습니다. 그것은 어떤 제품과 관련이 없습니다. 그러나 제품이 있다면 어떨까요? 그것을 참조하는 순서가 작성된 후에 제거 되었습니까? SQL 이를 지정할 수 있습니다. 직관적으로, 우리는 몇 가지가 있습니다 옵션 :

  • 참조 제품 삭제 허용

  • 주문 삭제

  • 다른 것?

이를 설명하려면 다음 정책을 구현하겠습니다 위의 다수의 관계 예 : 누군가가 원하는 경우 주문에 의해 여전히 참조되는 제품을 제거하려면 (v.Order_Items), 우리는 그것을 허용하지 않습니다. 만약에 누군가 주문을 제거하고 주문 항목은 다음과 같이 제거됩니다. 잘.

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

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

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

제한 및 계단식 삭제가 가장 일반적입니다 옵션.제한도 쓸 수 있습니다 처럼행동 없음그리고 기본값이기도합니다 아무것도 지정하지 않는 경우. 다른 두 가지 옵션이 있습니다 기본이 될 때 외국 키 열에서는 어떻게해야합니까? 키가 삭제됩니다 :SET NULLand기본값 설정. 이것들은 그렇지 않습니다 토토 베이 조건을 관찰하는 것을 실례합니다. 예를 들어, 행동 지정기본값 설정그러나 기본값은 외국 키를 충족시키지 못하며 삭제 기본 키의 실패가 실패합니다.

유사성ON DELETE또한on updatea 기본 키가 변경되었습니다 (업데이트). 가능한 행동은 같은.

데이터 업데이트 및 삭제에 대한 자세한 정보는PostgreSQL : 문서 : 7.4 : 토토 사이트 순위 조작.

마지막으로, 외국 키가 참조해야한다고 언급해야합니다. 기본 키이거나 고유 한 열인 열 강제. 외국 키가 고유 한 제약을 참조하는 경우 얼마나 무의미한 지에 대한 추가 가능성이 있습니다 값이 일치합니다. 이것들은 참조에 설명되어 있습니다 에 대한 문서테이블 생성.