Postgresql 9.2.24 문서 | ||||
---|---|---|---|---|
PostgreSQL : 문서 : 9.2 : 토토 핫 | 스포츠 토토 : 문서 : 9.2 : 데이터 정의 | 5 장. 데이터 정의 | PostgreSQL : 문서 : 9.2 : 롤 토토 열 |
데이터 유형은 될 수있는 데이터 종류를 제한하는 방법입니다. 테이블에 저장됩니다. 그러나 많은 응용 분야의 경우 토토 캔 조건이 있습니다 그들은 너무 거칠다. 예를 들어, a 제품 가격은 아마도 긍정적 인 가치 만 받아야 할 것입니다. 하지만 긍정적 인 만 수용하는 표준 데이터 유형이 없습니다. 숫자. 또 다른 문제는 열을 제한 할 수 있다는 것입니다. 다른 열 또는 행과 관련된 데이터. 예를 들어, a 제품 정보가 포함 된 테이블은 하나만 있어야합니다 각 제품 번호에 대한 행.
이를 위해 SQL은 열에서 토토 캔 조건을 정의 할 수 있습니다. 그리고 테이블. 토토 캔 조건은 귀하에게 데이터를 많이 제어 할 수 있습니다. 원하는대로 테이블. 사용자가 데이터를 저장하려는 경우 토토 캔 조건을 위반하는 열, 오류가 발생합니다. 이것 값이 기본값에서 나온 경우에도 적용됩니다. 정의.
점검 토토 캔 조건이 가장 일반적인 토토 캔 조건 유형입니다. 그것 특정 열의 값이 부울 (진실 가치) 표현을 만족시킵니다. 예를 들어 긍정적 인 제품 가격이 필요하면 사용할 수 있습니다.
테이블 제품 생성 ( product_no 정수, 이름 텍스트, 가격 숫자Check (가격 0));
보시다시피, 토토 캔 조건 정의는 데이터 뒤에옵니다. 기본값 정의와 마찬가지로 유형. 기본값 및 토토 캔 조건은 어떤 순서로든 나열 될 수 있습니다. 점검 토토 캔 핵심 단어로 구성check괄호 안의 표현식이 뒤 따릅니다. 점검 토토 캔 표현식은 따라서 제한된 열을 포함해야합니다. 그렇지 않으면 토토 캔이 너무 의미가 없습니다.
토토 캔 조건에 별도의 이름을 줄 수도 있습니다. 이것 오류 메시지를 명확히하고 변경해야 할 때 토토 캔. 구문은 다음과 같습니다.
테이블 제품 생성 ( product_no 정수, 이름 텍스트, 가격 숫자토토 캔 긍정적 _price점검 (가격 0) );
따라서 이름이 지정된 토토 캔 조건을 지정하려면 키워드를 사용하십시오토토 캔다음에 식별자가 이어집니다 토토 캔 조건 정의가 이어집니다. (당신이 지정하지 않는 경우 토토 캔자 이름이 방식으로 시스템은 이름을 선택합니다. 너.)
체크 토토 캔 조건은 여러 열을 참조 할 수도 있습니다. 말하다 당신은 일반 가격과 할인 된 가격을 저장하고 할인 된 가격이 일반보다 낮은지 확인하기 위해 가격:
테이블 제품 생성 ( product_no 정수, 이름 텍스트, 가격 숫자 점검 (가격 0), 할인 된 숫자 숫자 점검 (할인 된 _price 0),check (가격 할인 _price));
처음 두 가지 토토 캔 조건은 익숙해 보일 것입니다. 세 번째 하나는 새로운 구문을 사용합니다. 그것은 특정에 첨부되지 않습니다 열, 대신에 별도의 항목으로 나타납니다. 쉼표로 구분 된 열 목록. 열 정의 및 이것들 토토 캔 조건 정의는 혼합 순서로 나열 될 수 있습니다.
우리는 처음 두 가지 토토 캔이 열이라고 말합니다 토토 캔 조건, 세 번째는 테이블 토토 캔 조건입니다 하나의 열에서 별도로 작성되기 때문입니다 정의. 열 토토 캔 조건은 테이블로도 쓸 수도 있습니다 토토 캔 조건, 반대가 반드시 가능하지는 않지만 열 토토 캔 조건은 첨부 된 열. (PostgreSQL그 규칙을 시행하지는 않지만 테이블 정의가 작동하기를 원한다면 따라야합니다. 다른 데이터베이스 시스템과 함께.) 위의 예는 as :
테이블 제품 생성 ( product_no 정수, 이름 텍스트, 가격 숫자, 확인 (가격 0), 할인 된 숫자 숫자, Check (할인 된 _price 0), 확인 (가격 할인 _price) );
또는 심지어 :
테이블 제품 생성 ( product_no 정수, 이름 텍스트, 가격 숫자 점검 (가격 0), 할인 된 숫자 숫자, Check (할인 된 _price 0 및 가격 할인 _price) );
맛의 문제입니다.
이름을 같은 방식으로 테이블 토토 캔 조건에 할당 할 수 있습니다. 열 토토 캔 조건 :
테이블 제품 생성 ( product_no 정수, 이름 텍스트, 가격 숫자, 확인 (가격 0), 할인 된 숫자 숫자, Check (할인 된 _price 0),토토 캔 조건 valid_discountcheck (가격 할인 _price) );
점검 토토 캔이 충족된다는 점에 유의해야합니다. 점검 표현식은 true 또는 null 값으로 평가됩니다. 부터 대부분의 표현식은 피연산자 인 경우 널 값으로 평가됩니다. 널, 그들은 제한된 값에서 널 값을 방지하지 않습니다. 열. 열에 널 값이 포함되지 않도록 다음 섹션에 설명 된 널없는 토토 캔 조건은 다음과 같습니다. 사용된.
NOT NULL ASRESTAINT는 단순히 열이 필요하다는 것을 지정합니다 널 값을 가정하지 마십시오. 구문 예 :
테이블 제품 생성 ( product_no 정수NOT NULL, 이름 텍스트NOT NULL, 가격 숫자 );
NOT NULL 토토 캔 조건은 항상 열로 작성됩니다 강제. 널없는 토토 캔 조건은 기능적으로 동일합니다 체크 토토 캔 만들기확인 (column_name, 그러나에서PostgreSQL생성 명백한 널없는 토토 캔 조건이 더 효율적입니다. 단점은입니다 당신은 널없는 토토 캔 조건에 명시적인 이름을 줄 수 없다는 것입니다 이런 식으로 만들어졌습니다.
물론 열에는 둘 이상의 토토 캔 조건을 가질 수 있습니다. 단지 토토 캔 조건을 차례로 작성하십시오 :
테이블 제품 생성 ( product_no 정수는 null, 이름 텍스트가 null, 가격 숫자가 아닌 가격 확인 (가격 0) );
주문은 중요하지 않습니다. 반드시 결정되는 것은 아닙니다 토토 캔 조건을 순서대로 확인합니다.
theNOT NULL토토 캔 조건이 있습니다 역 반대 :NULL토토 캔. 이것 열이 null이어야한다는 것을 의미하지는 않습니다. 쓸모 없다. 대신, 이것은 단순히 기본 동작을 선택합니다 열이 무일하게 될 수 있습니다. 그만큼NULLSQL에는 토토 캔이 없습니다 표준이며 휴대용 응용 프로그램에서 사용해서는 안됩니다. (그것 에만 추가되었습니다.PostgreSQL다른 데이터베이스 시스템과 호환됩니다.) 일부 사용자, 그러나 그것을 쉽게 전환 할 수 있기 때문에 스크립트 파일의 토토 캔. 예를 들어, 당신은 시작할 수 있습니다 와 함께:
테이블 제품 생성 ( product_no 정수 null, 이름 텍스트 null, 가격 숫자 널 );
그런 다음not키 단어 원하는 곳.
팁 :대부분의 데이터베이스 디자인에서 대부분의 경우 열은 널 표시되지 않아야합니다.
고유 한 토토 캔 조건은 a 열 또는 열 그룹은 모든 행에서 독특합니다. 테이블. 구문은 다음과 같습니다.
테이블 제품 생성 ( product_no 정수고유 한, 이름 텍스트, 가격 숫자 );
열 토토 캔 조건으로 작성 될 때 :
테이블 제품 생성 ( product_no 정수, 이름 텍스트, 가격 숫자,고유 (Product_No));
테이블 토토 캔으로 작성 될 때.
열 그룹에 대한 고유 한 토토 캔 조건을 정의하려면 쓰기 열 이름이 분리 된 테이블 토토 캔 조건으로 쉼표 :
테이블 작성 예제 ( 정수, B 정수, C 정수,독특한 (A, C));
이것은 값의 조합을 지정합니다 표시된 열은 전체 테이블에서 독특하지만 열 중 하나는 할 필요가 없습니다 (일반적으로 그렇지 않습니다) 고유한.
당신은 고유 한 토토 캔 조건에 대해 자신의 이름을 할당 할 수 있습니다. 일반적인 방법 :
테이블 제품 생성 ( product_no 정수토토 캔 조건 Must_be_different고유 한, 이름 텍스트, 가격 숫자 );
고유 한 토토 캔 조건을 추가하면 자동으로 a가 생성됩니다 나열된 열 또는 열 그룹의 고유 한 B- 트리 색인 토토 캔. 일부만 덮는 독창성 제한 줄은 고유 한 토토 캔으로 작성할 수 없지만 고유 한 것을 만들어 그러한 제한을 시행 할 수 있습니다PostgreSQL : 문서 : 9.2 : 부분 토토 결과.
일반적으로 더 많은 경우 고유 한 토토 캔 조건이 위반됩니다. 모든 값이있는 테이블의 한 줄보다 토토 캔 조건에 포함 된 열은 동일합니다. 그러나 두 널 이 비교에서는 값이 동일하게 간주되지 않습니다. 저것 독특한 토토 캔 조건이있는 경우에도 널 값을 포함하는 중복 행을 저장할 수 있습니다. 제한된 열 중 하나 이상. 이 행동은 준수합니다 SQL 표준에 대해서는 다른 SQL 데이터베이스를 들었습니다. 이 규칙을 따르지 않을 수 있습니다. 따라서 개발할 때주의하십시오 휴대용의 고안된 응용 프로그램.
기본 키 토토 캔 조건은 열 또는 그룹을 나타냅니다. 열의 열에 대한 고유 식별자로 사용할 수 있습니다. 테이블. 이것은 값이 독특하고 널. 따라서 다음 두 테이블 정의는 동일하게 받아들입니다 데이터:
테이블 제품 생성 ( Product_No 정수 고유 한 Null, Null, 이름 텍스트, 가격 숫자 );
테이블 제품 생성 ( product_no 정수기본 키, 이름 텍스트, 가격 숫자 );
기본 키는 둘 이상의 열에 걸쳐있을 수 있습니다. 구문은입니다 고유 한 토토 캔과 유사 :
테이블 작성 예제 ( 정수, B 정수, C 정수,기본 키 (A, C));
기본 키를 추가하면 자동으로 고유 한 것이 생성됩니다 열 또는 열에 나열된 열의 B- 트리 색인 기본 키, 열이 표시되도록 강제NOT NULL.
테이블에는 최대 하나의 기본 키가있을 수 있습니다. (어떤 것도있을 수 있습니다 독특하고 무감각 한 토토 캔 조건의 수입니다 기능적으로 거의 똑같은 일이지만 하나만 기본 키로 식별됩니다.) 관계형 데이터베이스 이론 모든 테이블에는 기본 키가 있어야합니다. 이 규칙은입니다 시행되지 않음postgresql, 그러나 일반적으로 그것을 따르는 것이 가장 좋습니다.
기본 키는 문서화 목적과 모두에 유용합니다 클라이언트 응용 프로그램의 경우. 예를 들어 GUI 응용 프로그램 행 값을 수정 허용 기본을 알아야합니다. 행을 고유하게 식별 할 수있는 테이블의 키. 거기 있습니다 또한 데이터베이스 시스템이 선언 된 경우 기본 키; 예를 들어, 1 차 키는 외국 키의 기본 대상 열을 정의합니다 테이블 참조.
외국 키 토토 캔 조건은 값이 열 (또는 열 그룹)은 나타나는 값과 일치해야합니다. 다른 테이블의 어떤 줄에. 우리는 이것이를 유지한다고 말합니다.참조 무결성둘 사이 관련 테이블.
우리가 몇 가지를 사용한 제품 테이블이 있다고 말합니다. 이미 시간 :
테이블 제품 생성 ( product_no 정수 기본 키, 이름 텍스트, 가격 숫자 );
그 주문의 주문을 저장하는 테이블이 있다고 가정 해 봅시다. 제품. 주문 테이블에만 포함되도록하고 싶습니다. 실제로 존재하는 제품의 순서. 그래서 우리는 외국을 정의합니다 제품을 참조하는 주문 테이블의 주요 토토 캔 조건 테이블:
테이블 주문 생성 ( Order_id 정수 기본 키, product_no 정수참조 제품 (Product_No), 수량 정수 );
이제 null이 아닌 주문을 만들 수 없습니다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) );
제한 및 계단식 삭제가 가장 일반적입니다 옵션.제한삭제를 방지합니다 참조 행.행동 없음토토 캔 조건이있을 때 참조 행이 여전히 존재하는 경우 확인하면 오류가 발생합니다. 이것은 기본 동작입니다 당신은 아무것도 지정하지 않습니다. (간의 필수 차이 이 두 가지 선택은행동 없음거래 후반까지 수표를 연기 할 수 있습니다. 반면제한그렇지 않습니다.)캐스케이드참조 행이있을 때를 지정합니다 삭제 된 행은 자동으로 삭제해야합니다 또한. 다른 두 가지 옵션이 있습니다.세트 널and기본값 설정. 이 원인 참조 열은 Nulls 또는 기본값으로 설정됩니다. 각각 참조 행이 삭제 될 때. 주목하십시오 이들은 토토 캔을 관찰하는 것을 실례하지 않습니다. 을 위한 예, 행동이 지정하는 경우세트 기본그러나 기본값은 만족하지 않습니다 외국 키, 작전이 실패합니다.
유사성ON DELETE또한on updatea 참조 열이 변경되었습니다 (업데이트). 가능한 행동 동일합니다.
이후삭제참조 테이블 또는 an업데이트of a 참조 열은 참조 테이블을 스캔해야합니다. 이전 가치와 일치하는 행의 경우 종종 좋은 생각입니다. 참조 열을 색인하십시오. 이것이 항상 그런 것은 아니기 때문입니다 필요하고 색인을 사용하는 방법에 대한 많은 선택이 있습니다. 외국 키 토토 캔 조건의 선언은 자동으로 없습니다 참조 열에서 색인 생성.
데이터 업데이트 및 삭제에 대한 자세한 정보는범퍼카 토토 : 문서 : 9.2 : 데이터 조작.
마지막으로, 외국 키가 참조해야한다고 언급해야합니다. 기본 키이거나 고유 한 열이있는 열 강제. 외국 키가 고유 한 토토 캔을 참조하는 경우 얼마나 무의미한 지에 대한 추가 가능성이 있습니다 값이 일치합니다. 이것들은 참조에 설명되어 있습니다 에 대한 문서PostgreSQL : 문서 : 9.2 : 무지개 토토 작성.
제외 토토 캔 조건은 두 행이 있는지 확인하십시오 지정된 열 또는 표현을 사용하여 비교 지정된 연산자, 이러한 연산자 중 하나 이상 False 또는 Null을 반환합니다. 구문은 다음과 같습니다.
테이블 서클 생성 ( C 서클, GIST 사용 (& with &&) 제외 );
제외 토토 캔 조건을 추가하면 자동으로 an이 생성됩니다 토토 캔 조건 선언에 지정된 유형의 색인