데이터 유형은 데이터 유형을 제한하는 방법입니다. 테이블에 저장됩니다. 그러나 많은 응용 프로그램의 경우 토토 베이 조건이 있습니다. 그들이 제공하는 것은 너무 거칠다. 예를 들어, 제품 가격은 양수 값만 허용해야 합니다. 하지만 양수만 허용하는 데이터 유형은 없습니다. 또 다른 문제는 열 데이터를 다음과 같이 제한하고 싶을 수도 있다는 것입니다. 다른 열이나 행을 기준으로 합니다. 예를 들어, 테이블에서 제품 정보를 포함하는 경우 행은 하나만 있어야 합니다. 각 제품 번호.
이를 위해 SQL을 사용하면 열에 대한 토토 베이 조건을 정의할 수 있습니다. 그리고 테이블. 토토 베이조건은 데이터에 대한 제어권을 최대한 제공합니다. 당신이 원하는대로 당신의 테이블. 사용자가 데이터를 저장하려고 시도하는 경우 토토 베이 조건을 위반하는 열이 있으면 오류가 발생합니다. 이 값이 기본값에서 나온 경우에도 적용됩니다. 정의.
체크 토토 베이은 가장 일반적인 토토 베이 유형입니다. 그것 특정 열의 값이 다음과 같이 지정되도록 지정할 수 있습니다. 임의의 표현식을 만족시킵니다. 예를 들어, 요구하려면 긍정적인 제품 가격을 사용하려면 다음을 사용할 수 있습니다.
테이블 제품 생성(
    product_no 정수,
    이름 텍스트,
    가격 숫자확인(가격  0)
);
    보시다시피 토토 베이 조건 정의는 데이터 뒤에 옵니다. 유형은 기본값 정의와 같습니다. 기본값 및 토토 베이 조건은 어떤 순서로도 나열될 수 있습니다. 검사 토토 베이조건 키워드로 구성됨확인다음에는 괄호 안의 표현식이 나옵니다. 검사 토토 베이조건 표현식에는 이렇게 제한된 열이 포함되어야 합니다. 그렇지 않으면 토토 베이조건이 너무 많이 발생하지 않을 것입니다. 감각.
또한 토토 베이조건에 별도의 이름을 지정할 수 있습니다. 이 오류 메시지를 명확하게 설명하고 변경해야 할 때 토토 베이 조건. 구문은 다음과 같습니다.
테이블 제품 생성(
    product_no 정수,
    이름 텍스트,
    가격 숫자CONSTRAINT positive_priceCHECK (가격  0)
);
    따라서 명명된 토토 베이 조건을 지정하려면 키워드를 사용하십시오.토토 베이다음에 식별자가 옴 토토 베이 조건 정의가 이어집니다.
검사 토토 베이 조건은 여러 열을 참조할 수도 있습니다. 말하다 일반 가격과 할인 가격을 저장하고 원하는 경우 할인된 가격이 일반 가격보다 낮은지 확인하기 위해 가격.
테이블 제품 생성(
    product_no 정수,
    이름 텍스트,
    가격 숫자 확인(가격  0),
    할인 가격 숫자 확인(할인 가격  0),
    확인(가격  할인_가격)
);
    처음 두 토토 베이 조건은 익숙해 보일 것입니다. 세 번째 하나는 새로운 구문을 사용합니다. 특정 항목에 첨부되지 않습니다. 대신에 별도의 항목으로 나타납니다. 쉼표로 구분된 열 목록입니다. 열 정의 및 토토 베이 조건 정의는 혼합된 순서로 나열될 수 있습니다.
처음 두 토토 베이 조건은 열이라고 말합니다. 토토 베이 조건, 세 번째 토토 베이 조건은 테이블 토토 베이 조건입니다. 열 정의와 별도로 작성되었기 때문입니다. 열 토토 베이 조건은 테이블 토토 베이 조건으로 작성할 수도 있습니다. 그 반대가 반드시 가능한 것은 아닙니다. 위의 예는 다음과 같이 작성할 수도 있습니다.
테이블 제품 생성(
    product_no 정수,
    이름 텍스트,
    가격 숫자,
    확인(가격  0),
    할인_가격 숫자,
    확인(할인_가격  0),
    확인(가격  할인_가격)
);
    또는 심지어
테이블 제품 생성(
    product_no 정수,
    이름 텍스트,
    가격 숫자 확인(가격  0),
    할인_가격 숫자,
    확인(할인_가격  0 AND 가격  할인_가격)
);
    취향의 문제입니다.
다음의 경우 검사 토토 베이 조건이 충족된다는 점에 유의해야 합니다. 검사 표현식은 true 또는 null 값으로 평가됩니다. 이후 피연산자가 하나인 경우 대부분의 표현식은 null 값으로 평가됩니다. null인 경우 제한된 범위에서 null 값을 방지하지 않습니다. 열. 열에 Null 값이 포함되지 않도록 하려면 다음 섹션에 설명된 null이 아닌 토토 베이 조건은 다음과 같아야 합니다. 사용되었습니다.
null이 아닌 토토 베이조건은 단순히 열이 다음을 충족해야 함을 지정합니다. null 값을 가정하지 마십시오. 구문 예:
테이블 제품 생성(
    product_no 정수NULL이 아님,
    이름 텍스트NULL이 아님,
    가격 숫자
);
    null이 아닌 토토 베이조건은 항상 열로 기록됩니다. 토토 베이. null이 아닌 토토 베이 조건은 기능적으로 다음과 동일합니다. 검사 토토 베이 조건 생성확인 (열_이름NULL이 아님), 하지만포스트그레SQL생성 중 명시적인 null이 아닌 토토 베이 조건이 더 효율적입니다. 단점은 null이 아닌 토토 베이 조건에는 명시적인 이름을 지정할 수 없습니다. 그렇게 만들어졌습니다.
물론, 열은 하나 이상의 토토 베이조건을 가질 수 있습니다. 그냥 토토 베이 조건을 차례로 작성합니다.
테이블 제품 생성(
    product_no 정수는 NULL이 아닙니다.
    이름 텍스트는 NULL이 아닙니다.
    가격 숫자 NOT NULL 확인(가격  0)
);
    순서는 중요하지 않습니다. 반드시 결정하는 것은 아니다 토토 베이 조건이 확인되는 순서입니다.
그NULL이 아님토토 베이조건에 다음이 있습니다. 역:NULL토토 베이. 이 이는 열이 Null이어야 한다는 의미는 아닙니다. 쓸모없어. 대신 이는 단순히 기본 동작을 정의합니다. 열이 null일 수 있습니다.NULL토토 베이조건은 SQL 표준에 정의되어 있지 않으며 정의되어서는 안 됩니다. 휴대용 애플리케이션에 사용됩니다. (다음에만 추가되었습니다.PostgreSQL호환 가능 다른 데이터베이스 시스템과 함께 사용할 수 있습니다.) 그러나 일부 사용자는 이를 좋아합니다. 스크립트에서 토토 베이 조건을 쉽게 전환할 수 있기 때문입니다. 파일. 예를 들어, 다음과 같이 시작할 수 있습니다.
테이블 제품 생성(
    product_no 정수 NULL,
    이름 텍스트 NULL,
    가격 숫자 NULL
);
    그리고 다음을 삽입하세요.아님키워드 원하는 곳에.
팁:대부분의 데이터베이스 설계에서는 대부분의 열은 null이 아닌 것으로 표시되어야 합니다.
고유한 토토 베이 조건은 열 또는 열 그룹은 모든 항목에 대해 고유합니다. 테이블의 행. 구문은 다음과 같습니다.
테이블 제품 생성(
    product_no 정수고유,
    이름 텍스트,
    가격 숫자
);
    열 토토 베이 조건으로 작성된 경우 및
테이블 제품 생성(
    product_no 정수,
    이름 텍스트,
    가격 숫자,고유(product_no)
);
    테이블 토토 베이조건으로 작성된 경우.
고유 토토 베이조건이 열 그룹을 참조하는 경우, 열은 쉼표로 구분되어 나열됩니다.
테이블 생성 예(
    정수,
    b 정수,
    c 정수,고유 (a, c)
);
    고유한 이름을 할당하는 것도 가능합니다 토토 베이조건:
테이블 제품 생성(
    product_no 정수CONSTRAINT must_be_다른고유,
    이름 텍스트,
    가격 숫자
);
    일반적으로 고유 토토 베이 조건은 다음과 같은 경우 위반됩니다. (적어도) 각 값이 있는 테이블의 두 행 토토 베이 조건의 일부인 해당 열은 다음과 같습니다. 동등하다. 그러나 이 경우 Null 값은 동일한 것으로 간주되지 않습니다. 고려. 즉, 고유한 존재가 있는 경우에도 토토 베이 조건으로 행을 무제한으로 저장할 수 있습니다. 제한된 조건 중 하나 이상에 null 값이 포함되어 있는 경우 열. 이 동작은 SQL 표준을 따르지만 우리는 다른 SQL 데이터베이스는 이 규칙을 따르지 않을 수도 있다고 들었습니다. 따라서 다음을 목적으로 하는 애플리케이션을 개발할 때는 주의하십시오. 휴대 가능합니다.
기술적으로 기본 키 토토 베이 조건은 단순히 고유 토토 베이 조건과 null이 아닌 토토 베이 조건의 조합입니다. 따라서 다음 두 테이블 정의는 동일한 값을 허용합니다. 데이터:
테이블 제품 생성(
    product_no 정수 UNIQUE NOT NULL,
    이름 텍스트,
    가격 숫자
);
    테이블 제품 생성(
    product_no 정수기본 키,
    이름 텍스트,
    가격 숫자
);
    기본 키는 둘 이상의 열을 제한할 수도 있습니다. 는 구문은 고유 토토 베이 조건과 유사합니다.
CREATE TABLE 예(
    정수,
    b 정수,
    c 정수,기본 키(a, c)
);
    기본 키는 열 또는 열 그룹을 나타냅니다. 테이블의 행에 대한 고유 식별자로 사용될 수 있습니다. (이 기본 키 정의의 직접적인 결과입니다. 고유 토토 베이조건은 그 자체로는 다음을 제공하지 않습니다. null 값을 제외하지 않기 때문에 고유 식별자입니다.) 이는 문서화 목적과 클라이언트 모두에 유용합니다. 응용 프로그램. 예를 들어, 다음을 허용하는 GUI 애플리케이션 행 값을 수정하려면 기본 키를 알아야 할 수도 있습니다. 행을 고유하게 식별할 수 있는 테이블입니다.
테이블은 최대 하나의 기본 키를 가질 수 있습니다. 많은 고유하고 null이 아닌 토토 베이 조건). 관계형 데이터베이스 이론에 따르면 모든 테이블에는 기본 키가 있어야 합니다. 이 규칙은 다음에 의해 시행되지 않습니다.포스트그레SQL, 하지만 일반적으로 다음을 수행하는 것이 가장 좋습니다. 따라가세요.
외래 키 토토 베이 조건은 열(또는 열 그룹)은 표시되는 값과 일치해야 합니다. 다른 테이블의 어떤 행에. 우리는 이것이 다음을 유지한다고 말합니다.참조 무결성둘 사이 관련 테이블.
우리가 여러 개 사용한 제품 테이블이 있다고 가정해 보겠습니다. 이미 여러 번:
테이블 제품 생성(
    product_no 정수 기본 키,
    이름 텍스트,
    가격 숫자
);
    또한 이러한 주문을 저장하는 테이블이 있다고 가정해 봅시다 제품. 우리는 주문 테이블에 다음 항목만 포함되도록 하고 싶습니다. 실제로 존재하는 제품을 주문합니다. 그래서 우리는 외국을 정의합니다 제품을 참조하는 주문 테이블의 키 토토 베이조건 테이블:
테이블 주문 생성(
    order_id 정수 기본 키,
    product_no 정수REFERENCES 제품 (product_no),
    수량 정수
);
    이제 다음으로는 주문을 생성할 수 없습니다.product_no다음에 나타나지 않는 항목 제품 테이블.
이 상황에서 주문 테이블은 다음과 같습니다.참조테이블과 제품 테이블은참조테이블. 마찬가지로 참조 열과 참조 열이 있습니다.
위 명령을 다음과 같이 단축할 수도 있습니다.
테이블 주문 생성(
    order_id 정수 기본 키,
    product_no 정수 REFERENCES 제품,
    수량 정수
);
    열 목록이 없으면 기본 키가 참조 테이블이 참조 열로 사용됩니다.
외래 키는 다음 그룹을 제한하고 참조할 수도 있습니다. 열. 평소와 같이 테이블에 작성해야 합니다. 토토 베이 형태. 다음은 인위적인 구문 예입니다.
테이블 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로 설정그리고기본값으로 설정. 이것들은 그렇지 않습니다. 토토 베이 사항을 준수하지 못해 죄송합니다. 예를 들어, 작업이 지정함기본값으로 설정하지만 기본값이 외래 키를 충족하지 않을 경우 삭제 기본 키 중 하나가 실패합니다.
유사삭제 중있습니다 또한업데이트 중이는 다음과 같은 경우에 호출됩니다. 기본 키가 변경(업데이트)되었습니다. 가능한 조치는 다음과 같습니다. 마찬가지다.
데이터 업데이트 및 삭제에 대한 자세한 내용은 다음을 참조하세요.PostgreSQL : 문서 : 7.4 : 토토 사이트 순위 조작.
마지막으로 외래 키는 참조해야 한다는 점을 언급해야 합니다. 기본 키이거나 고유 키를 형성하는 열 토토 베이. 외래 키가 고유 토토 베이 조건을 참조하는 경우 null 방법에 관한 몇 가지 추가 가능성이 있습니다. 값이 일치합니다. 이에 대한 설명은 참고자료에 나와 있습니다. 에 대한 문서테이블 생성.