이 문서는 지원되지 않는 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 (가격  할인_가격)
);

다음과 같은 경우 검사 제약 조건이 충족된다는 점에 유의해야 합니다. check 표현식은 true 또는 null 값으로 평가됩니다. 대부분의 이후 표현식은 피연산자가 null인 경우 null 값으로 평가됩니다. 제한된 열의 Null 값을 방지하지 않습니다. 받는 사람 열에 Null 값이 포함되어 있지 않은지 확인하세요. 다음 섹션에 설명된 제약 조건을 사용할 수 있습니다.

5.3.2. Null이 아님 제약

null이 아닌 제약조건은 단순히 열이 null이 아니어야 함을 지정합니다. null 값을 가정합니다. 구문 예:

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

null이 아닌 제약조건은 항상 열 제약조건으로 기록됩니다. null이 아닌 제약 조건은 기능적으로 제약 조건 확인확인(열_이름NULL이 아님)하지만PostgreSQL명시적 생성 null이 아닌 제약 조건이 더 효율적입니다. 단점은 당신이 이 생성된 null이 아닌 제약 조건에는 명시적인 이름을 지정할 수 없습니다. 방법.

물론, 열은 하나 이상의 제약조건을 가질 수 있습니다. 그냥 제약 조건을 차례로 작성합니다.

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

순서는 중요하지 않습니다. 반드시 에서 결정되는 것은 아닙니다. 제약 조건을 확인하는 순서입니다.

NULL이 아님제약조건에는 반대가 있습니다:NULL제약. 이것은 의미하지 않습니다 열은 null이어야 하며 이는 확실히 쓸모가 없습니다. 대신 이는 단순히 열이 수행하는 기본 동작을 선택합니다. null일 수 있습니다. 그만큼NULL제약조건이 아님 SQL 표준에 존재하며 이식 가능한 환경에서 사용하면 안 됩니다. 응용 프로그램. (다음에만 추가되었습니다.PostgreSQL다른 것과 호환되다 데이터베이스 시스템.) 그러나 일부 사용자는 이를 좋아합니다. 스크립트 파일에서 제약 조건을 쉽게 전환할 수 있습니다. 예를 들어, 당신은 다음으로 시작할 수 있습니다:

테이블 제품 생성(
    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-트리 인덱스 제약. 일부 행에만 적용되는 고유성 제한은 다음과 같습니다. 고유 제약 조건으로 작성되지만 강제 적용이 가능합니다. 고유한 생성을 통해 이러한 제한을 적용합니다.부분 색인.

일반적으로 더 많은 경우 고유 제약 조건을 위반합니다. 모든 열의 값이 있는 테이블의 한 행 이상 제약 조건에 포함된 값은 동일합니다. 그러나 두 개의 null 값은 이 비교에서는 결코 동등하다고 간주되지 않습니다. 즉, 심지어 고유 제약 조건이 있으면 중복된 내용을 저장할 수 있습니다. 제한된 행 중 하나 이상에 null 값이 포함된 행 열. 이 동작은 SQL 표준을 따르지만 다른 SQL 데이터베이스에서는 이 규칙을 따르지 않을 수도 있다고 들었습니다. 그러니 의도된 응용 프로그램을 개발할 때는 주의하십시오. 휴대용.

5.3.4. 기본 키

기본 키 제약 조건은 열 또는 그룹이 열은 테이블의 행에 대한 고유 식별자로 사용될 수 있습니다. 이를 위해서는 값이 고유하고 null이 아니어야 합니다. 그래서, 다음 두 테이블 정의는 동일한 데이터를 허용합니다.

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

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

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

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

테이블은 최대 하나의 기본 키를 가질 수 있습니다. (아무거나 있을 수 있어요. 기능적으로는 null이 아닌 고유한 제약 조건의 수 거의 동일하지만 하나만 식별할 수 있습니다. 기본 키.) 관계형 데이터베이스 이론에 따르면 모든 테이블은 기본 키가 있어야 합니다. 이 규칙은 다음에 의해 시행되지 않습니다.포스트그레SQL, 하지만 일반적으로 따르는 것이 가장 좋습니다. 그것.

기본 키는 문서화 목적과 용도 모두에 유용합니다. 클라이언트 애플리케이션. 예를 들어, 다음을 허용하는 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)
);

물론 제한된 열의 수와 유형이 필요합니다. 참조된 열의 수와 유형을 일치시킵니다.

외래 키 제약조건에 자신의 이름을 지정할 수 있습니다. 평소대로.

테이블에는 하나 이상의 외래 키 제약 조건이 있을 수 있습니다. 이것은 테이블 간의 다대다 관계를 구현하는 데 사용됩니다. 말하다 제품과 주문에 대한 테이블이 있는데 이제 다음을 원합니다. 하나의 주문에 여러 제품이 포함될 수 있도록 허용합니다( 위의 구조는 허용되지 않았습니다). 이 테이블을 사용해도 됩니다. 구조:

테이블 제품 생성(
    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 또는 기본값으로 설정됩니다. 참조된 행이 삭제될 때 각각의 값입니다. 참고하세요 이로 인해 제약 조건을 준수하지 않아도 되는 것은 아닙니다. 에 대한 예, 작업이 지정하는 경우SET 기본값그러나 기본값은 외부를 만족시키지 않습니다. 키 제약 조건이 적용되면 작업이 실패합니다.

유사삭제 중또한 있습니다업데이트 중이는 다음과 같은 경우에 호출됩니다. 참조된 열이 변경(업데이트)되었습니다. 가능한 조치는 다음과 같습니다. 동일합니다. 이 경우,캐스케이드즉, 참조된 열의 업데이트된 값을 복사해야 합니다. 참조 행에 넣습니다.

일반적으로 참조 행은 외래 키를 충족할 필요가 없습니다. 참조하는 열 중 하나라도 null인 경우 제약 조건입니다. 만일전체 일치외래 키에 추가됨 선언, 참조 행이 제약 조건을 충족하여 이스케이프됩니다. 참조하는 모든 열이 null인 경우에만(따라서 null과 null이 아닌 값은 실패가 보장됩니다.일치 전체제약). 행 참조를 원하지 않는 경우 외래 키 제약 조건을 충족하는 것을 피할 수 있으면 다음을 선언하세요. 열을 다음과 같이 참조합니다.NULL이 아님.

외래 키는 기본 열 또는 열을 참조해야 합니다. 키를 지정하거나 고유 제약 조건을 형성합니다. 이는 참조된 열에는 항상 인덱스(기본 키 또는 기본 키의 기본 인덱스)가 있습니다. 고유 제약조건); 참조 행에 경기가 효율적일 것입니다. 이후삭제의 참조된 테이블의 행 또는업데이트28783_29144

데이터 업데이트 및 삭제에 대한 자세한 내용은 다음을 참조하세요.6장. 외래 키에 대한 설명도 참조하세요. 참조 문서의 제약 조건 구문테이블 생성.

5.3.6. 제외 제약사항

제외 제약 조건은 두 행이 비교되는 경우 보장합니다. 지정된 열 또는 지정된 표현식을 사용하는 표현식 연산자, 이러한 연산자 비교 중 하나 이상이 반환됩니다. 거짓 또는 null. 구문은 다음과 같습니다.

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

또한 참조테이블 생성 ... 제약 조건 ... 제외용 세부사항.

제외 제약조건을 추가하면 자동으로 제약 조건 선언에 지정된 유형의 인덱스입니다.