데이터 유형은 될 수있는 데이터 종류를 제한하는 방법입니다. 테이블에 저장됩니다. 그러나 많은 응용 분야의 경우 토토 결과 조건이 있습니다 그들은 너무 거칠다. 예를 들어, a 제품 가격은 아마도 긍정적 인 가치 만 받아야 할 것입니다. 하지만 긍정적 인 만 수용하는 표준 데이터 유형이 없습니다. 숫자. 또 다른 문제는 열을 제한 할 수 있다는 것입니다. 다른 열 또는 행과 관련된 데이터. 예를 들어, a 제품 정보가 포함 된 테이블은 하나만 있어야합니다 각 제품 번호에 대한 행.
이를 위해 SQL은 열에서 토토 결과 조건을 정의 할 수 있습니다. 그리고 테이블. 토토 결과 조건은 귀하에게 데이터를 많이 제어 할 수 있습니다. 원하는대로 테이블. 사용자가 데이터를 저장하려는 경우 토토 결과 조건을 위반하는 열, 오류가 발생합니다. 이것 값이 기본값에서 나온 경우에도 적용됩니다. 정의.
점검 토토 결과 조건이 가장 일반적인 토토 결과 조건 유형입니다. 그것 특정 열의 값이 부울 (진실 가치) 표현을 만족시킵니다. 예를 들어 긍정적 인 제품 가격이 필요하면 사용할 수 있습니다.
테이블 제품 생성 ( product_no 정수, 이름 텍스트, 가격 숫자점검 (가격 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) );
점검 토토 결과이 만족되는 경우에 주목해야합니다. 점검 표현식은 true 또는 null 값으로 평가됩니다. 부터 대부분의 표현식은 피연산자 인 경우 널 값으로 평가됩니다. 널, 그들은 제한된 값에서 널 값을 방지하지 않습니다. 열. 열에 널 값이 포함되지 않도록 다음 섹션에 설명 된 널없는 토토 결과 조건은 다음과 같습니다. 사용된.
NOT NULL 토토 결과 조건은 단순히 열이 필요하다는 것을 지정합니다 널 값을 가정하지 마십시오. 구문 예 :
테이블 제품 생성 ( 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고유 한, 이름 텍스트, 가격 숫자 );
일반적으로, 고유 한 토토 결과은 모든의 값이 토토 결과 조건에 포함 된 열은 동일합니다. 그러나 두 널 이 비교에서 값은 동일하게 간주되지 않습니다. 그것은 의미합니다 고유 한 토토 결과 조건이 있더라도 가능합니다. 하나 이상의 널 값을 포함하는 중복 행을 저장 제한된 열의. 이 동작은 SQL을 준수합니다 표준이지만 다른 SQL 데이터베이스가 이 규칙을 따르십시오. 따라서 응용 프로그램을 개발할 때주의하십시오 휴대용이라는 것입니다.
기술적으로, 주요 주요 토토 결과 조건은 단순히 a입니다 독특한 토토 결과 조건과 무감각 한 토토 결과 조건의 조합. 따라서 다음 두 테이블 정의는 동일하게 받아들입니다 데이터:
테이블 제품 생성 ( Product_No 정수 고유 한 Null, Null, 이름 텍스트, 가격 숫자 );
테이블 제품 생성 ( product_no 정수기본 키, 이름 텍스트, 가격 숫자 );
기본 키는 둘 이상의 열을 제한 할 수 있습니다. 그만큼 구문은 고유 한 토토 결과과 유사합니다.
테이블 작성 예제 ( 정수, B 정수, C 정수,기본 키 (A, C));
기본 키는 열 또는 열 그룹이 테이블의 행에 고유 식별자로 사용할 수 있습니다. (이것 기본 키 정의의 직접적인 결과입니다. 고유 한 토토 결과 조건 자체는 널 값을 제외하지 않기 때문에 고유 식별자.) 이것은 문서화 목적과 클라이언트 모두에 유용합니다. 응용 프로그램. 예를 들어, 허용하는 GUI 응용 프로그램 행 값을 수정하면 아마도 기본 키를 알아야합니다. 행을 독창적으로 식별 할 수있는 테이블.
테이블에는 최대 하나의 기본 키가있을 수 있습니다. (어떤 것도있을 수 있습니다 독특하고 무감각 한 토토 결과 조건의 수입니다 기능적으로 똑같은 것은 기본 키.) 관계형 데이터베이스 이론은이를 지시합니다 모든 테이블에는 기본 키가 있어야합니다. 이 규칙은 시행되지 않습니다 에 의해PostgreSQL그러나 그렇습니다 보통 그것을 따르는 것이 가장 좋습니다.
외국 키 토토 결과 조건은 값이 열 (또는 열 그룹)은 나타나는 값과 일치해야합니다. 다른 테이블의 어떤 줄에. 우리는 이것이를 유지한다고 말합니다.참조 무결성둘 사이 관련 테이블.
우리가 몇 가지를 사용한 제품 테이블이 있다고 말합니다. 이미 시간 :
테이블 제품 생성 ( 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) );
제한 및 계단식 삭제가 가장 일반적입니다 옵션.제한삭제를 방지합니다 참조 행.행동 없음토토 결과 조건이있을 때 참조 행이 여전히 존재하는 경우 확인하면 오류가 발생합니다. 이것은 기본 동작입니다 당신은 아무것도 지정하지 않습니다. (간의 필수 차이 이 두 가지 선택은행동 없음거래 후반까지 수표를 연기 할 수 있습니다. 반면제한그렇지 않습니다.)캐스케이드참조 행이있을 때를 지정합니다 삭제 된 행은 자동으로 삭제해야합니다 또한. 다른 두 가지 옵션이 있습니다.세트 널및기본값 설정. 이 원인 참조 열은 Nulls 또는 기본값으로 설정됩니다. 각각 참조 행이 삭제 될 때. 주목하십시오 이들은 토토 결과을 관찰하는 것을 실례하지 않습니다. 을 위한 예, 행동이 지정하는 경우세트 기본그러나 기본값은 만족하지 않습니다 외국 키, 작전이 실패합니다.
유사성ON DELETE또한on updatea 참조 열이 변경되었습니다 (업데이트). 가능한 행동 동일합니다.
데이터 업데이트 및 삭제에 대한 자세한 정보는토토 베이 : 문서 : 8.2 : 데이터 조작.
마지막으로, 외국 키가 참조해야한다고 언급해야합니다. 기본 키이거나 고유 한 열이있는 열 강제. 외국 키가 고유 한 토토 결과을 참조하는 경우 얼마나 무의미한 지에 대한 추가 가능성이 있습니다 값이 일치합니다. 이것들은 참조에 설명되어 있습니다 에 대한 문서테이블 생성.