복붙노트

[SQL] 외래 키는 NULL 및 / 또는 복제 될 수 있을까?

SQL

외래 키는 NULL 및 / 또는 복제 될 수 있을까?

나에게 두 가지를 명확히하십시오 :

내가 아는 한 공정으로, NULL은 외래 키에 사용하지 않아야하지만, 내 일부 응용 프로그램에서 나는 오라클과 SQL 서버 모두에서 입력 NULL 수 있어요, 나는 이유를 알지 못한다.

해결법

  1. ==============================

    1.짧은 대답 : 예, 그것은 NULL이거나 복제 할 수 있습니다.

    짧은 대답 : 예, 그것은 NULL이거나 복제 할 수 있습니다.

    나는 외래 키가 null해야 할 수 있습니다 또는 고유 고유 여부를해야 할 수 있습니다 이유를 설명하고자합니다. 먼저 외래 키가 단순히 필드의 값이 다른 테이블 (부모 테이블)에 먼저 존재해야해야 기억한다. 즉 전혀 FK는 정의입니다. 정의에 널은 값이 아닙니다. 널 수단을 우리는 아직 값이 무엇인지 모르는.

    내가 당신에게 실제 생활 예를 들어 보겠습니다. 당신은 상점 판매 제안이 데이터베이스가 가정하자. 각각의 제안은 할당 된 하나 판매 사람과 하나 개의 클라이언트를 가지고 있다고 가정하자. 그래서 제안 테이블은 두 개의 외래 키, 클라이언트 ID 하나와 영업 담당자의 ID와 하나가있을 것입니다. (아무도 아직 작업 할 무료 없기 때문에) 그러나, 기록이 작성 될 때, 판매 담당자는 항상 클라이언트 ID가 채워되지만 영업 담당자 ID가 널 (null)이 될 수도, 할당되지 않습니다. 즉, 일반적으로는 데이터가 입력 될 때 그 값을 알 수 없습니다 널 FK을 할 수있는 능력이 필요하지만, 당신이 할 필요가 입력 할 수있는 테이블의 다른 값을 알고있다. 일반적으로는이 FK을 가지고 필드에서 널 (null)을 허용해야 할 모든 FK에 널 (null)을 허용합니다. NULL 값은이 FK되는 아이디어 별개입니다.

    이 고유의 독특한 여부 테이블이 하나 하나 부모 테이블에 한 일대 다 관계가 있는지 여부에 관한 것이다. 당신이 한 - 일 관계가 지금, 만약 당신이 하나 개의 테이블에있는 데이터 모두를 가질 수 있지만, 테이블이 너무 넓어지고있는 경우 또는 가능성이 데이터가 (직원 다른 주제에있는 경우 - 보험 예를 들어 @tbone 준 ) 예를 들어, 당신은 FK와 별도의 테이블을합니다. 그런 다음 중 하나이 FK (고유성 보장)이 PK를 만들거나 그것에 고유 제한 조건을 데려 가고 싶다는 것입니다.

    대부분의 FKS 많은 관계로 하나이며, 그것은 당신이 필드에 추가 제약 조건을 추가하지 않고 FK에서 무엇을 얻을 수 있습니다. 그래서 당신은 주문 테이블과 인스턴스에 대한 주문 세부 테이블이 있습니다. 한 번에 고객의 주문 열 항목 경우에, 그는 한 순서와 FK와 같은 주문 ID를 포함하는 열 주문 상세 기록을 가지고있다.

  2. ==============================

    2.1 - 네, 적어도 SQL 서버 2000입니다.

    1 - 네, 적어도 SQL 서버 2000입니다.

    2 - 예, 그것이이 UNIQUE 제약 조건 또는 고유 인덱스에 연결되지이다로.

  3. ==============================

    3.말의 입에서 :

    말의 입에서 :

    이것 좀 봐:

    오라클 11g 링크

  4. ==============================

    4.수석 프로그래머가 위에 말한대로 ... 난 외국 키가 null가 필요합니다 다른 시나리오를 추가 할 예 외래 키는 null이 될 수 있습니다 .... 우리가 사진과 동영상에 대한 의견을 수있는 응용 프로그램의 테이블 코멘트, 사진 및 동영상을 가정합니다. 의견 테이블에서 우리는 기본 키 CommentId와 함께 두 개의 외래 키 PicturesId 및 VideosId을 가질 수 있습니다. 이 동영상에 댓글 그래서에만 VideosId이 요구 될 것이며, pictureId가 null이 될 것입니다 ... 당신이 사진에 대해 언급 경우에만 PictureId이 필요한 것입니다 및 VideosId가 null이 될 것입니다 ...

    수석 프로그래머가 위에 말한대로 ... 난 외국 키가 null가 필요합니다 다른 시나리오를 추가 할 예 외래 키는 null이 될 수 있습니다 .... 우리가 사진과 동영상에 대한 의견을 수있는 응용 프로그램의 테이블 코멘트, 사진 및 동영상을 가정합니다. 의견 테이블에서 우리는 기본 키 CommentId와 함께 두 개의 외래 키 PicturesId 및 VideosId을 가질 수 있습니다. 이 동영상에 댓글 그래서에만 VideosId이 요구 될 것이며, pictureId가 null이 될 것입니다 ... 당신이 사진에 대해 언급 경우에만 PictureId이 필요한 것입니다 및 VideosId가 null이 될 것입니다 ...

  5. ==============================

    5.그것은 당신의 관계에서 어떤 역할이 외래 키 재생에 따라 달라집니다.

    그것은 당신의 관계에서 어떤 역할이 외래 키 재생에 따라 달라집니다.

  6. ==============================

    6.여기에 오라클 구문을 사용하여 예입니다 : 먼저의 테이블 국가를 만들 수 있습니다

    여기에 오라클 구문을 사용하여 예입니다 : 먼저의 테이블 국가를 만들 수 있습니다

    CREATE TABLE TBL_COUNTRY ( COUNTRY_ID VARCHAR2 (50) NOT NULL ) ;
    ALTER TABLE TBL_COUNTRY ADD CONSTRAINT COUNTRY_PK PRIMARY KEY ( COUNTRY_ID ) ;
    

    테이블 지방을 만들기

    CREATE TABLE TBL_PROVINCE(
    PROVINCE_ID VARCHAR2 (50) NOT NULL ,
    COUNTRY_ID  VARCHAR2 (50)
    );
    ALTER TABLE TBL_PROVINCE ADD CONSTRAINT PROVINCE_PK PRIMARY KEY ( PROVINCE_ID ) ;
    ALTER TABLE TBL_PROVINCE ADD CONSTRAINT PROVINCE_COUNTRY_FK FOREIGN KEY ( COUNTRY_ID ) REFERENCES TBL_COUNTRY ( COUNTRY_ID ) ;
    

    이것은 오라클에 완벽하게 정상적으로 실행됩니다. "NOT NULL"을하지 않는 두 번째 테이블의 COUNTRY_ID 외래 키를 알 수 있습니다.

    이제 지방 테이블에 행을 삽입, 그것은 단지 PROVINCE_ID를 지정하기에 충분합니다. 당신이뿐만 아니라 COUNTRY_ID를 지정하도록 선택한 경우 그러나, 그것은 COUNTRY 테이블에 이미 존재해야합니다.

  7. ==============================

    7.기본적으로 외래 키에 아무런 제약, 외래 키가 null를 할 수없고 복제 할 수있다.

    기본적으로 외래 키에 아무런 제약, 외래 키가 null를 할 수없고 복제 할 수있다.

    고유성의 구속을 추가하거나하지 않을 경우, 테이블을 변경 / 테이블을 작성하는 동안 만이 널 (null) / 중복 값을 허용하지 않습니다는 null.

  8. ==============================

    8.간단히 엔티티 사이의 관계가 ER-모델의 일부이며 ER-다이어그램을 설계 할 때 Microsoft Visio에 사용할 수 있습니다 "비는 식별"했습니다. 이것은 "0 개 이상의 제로보다"유형의 엔티티 사이의 카디널리티를 시행하는 데 필요한, 또는 "0 또는 1"입니다. 참고 대신 "많은 하나"의 "하나"의 카디널리티이 "제로".

    간단히 엔티티 사이의 관계가 ER-모델의 일부이며 ER-다이어그램을 설계 할 때 Microsoft Visio에 사용할 수 있습니다 "비는 식별"했습니다. 이것은 "0 개 이상의 제로보다"유형의 엔티티 사이의 카디널리티를 시행하는 데 필요한, 또는 "0 또는 1"입니다. 참고 대신 "많은 하나"의 "하나"의 카디널리티이 "제로".

    이제 비 식별 관계의 예는 카디널리티 될 수있다 "제로"(비 확인) 우리는 하나의 엔티티-A의 기록 / 객체 또는 레코드에 대한 참조 등의 값이 "NOT있다", "할 수있다"라고 언제 / 다른 엔티티 B 입력 S.

    같은 다른 엔티티 B의 기록 자체를 식별하는 실체-A의 하나 개의 레코드의 가능성이 있기 때문에 엔티티 B의 레코드의 ID 값을 갖는 엔티티 B의 열이 있어야한다. 이 열은 "NULL"일 수있다 경우 엔티티-A 식별 없음 레코드 엔티티 B의 기록 / s (또는 객체 / S).

    클래스 B의 목적은 반드시 클래스 B를 의미 그 존재에 대한 클래스-A의 객체 (강하게 결합) 의존하지 않는 경우 패러다임 객체 지향 (실제)에서, 상황이있다는 클래스 -와 느슨하게 결합입니다 같은 클래스 - 그것의 (객체에 대해 (구성) 클래스-A의 객체가 있어야합니다 클래스 B의 객체의 개념에 반대 클래스-A는 (봉쇄) 클래스-A의 객체를, "비 포함"수 B) 생성.

    보기의 SQL 쿼리의 관점에서, 당신은 엔티티-B 예약 외래 키는 "null이"입니다 엔티티-B의 모든 기록을 조회 할 수 있습니다. 이것은 양자 택일 널 값이 모든 기록은 엔티티-B의 엔티티-A의 모든 기록이없는 기록 될 것입니다 엔티티-A의 행에 대한 특정 해당하는 값을 갖는 모든 레코드를 가져올 것이다.

  9. ==============================

    9.나는 우리가 테이블에이 가능한 기수를 고려하는 것이 더 나은 생각합니다. 우리는 가능한 최소 카디널리티 제로를 가질 수 있습니다. 옵션이되고있는 경우, 관련 테이블에서 튜플의 최소 참여는 이제 널 (null)을 허용하는 외래 키 값의 필요성에 직면, 제로 수 있습니다.

    나는 우리가 테이블에이 가능한 기수를 고려하는 것이 더 나은 생각합니다. 우리는 가능한 최소 카디널리티 제로를 가질 수 있습니다. 옵션이되고있는 경우, 관련 테이블에서 튜플의 최소 참여는 이제 널 (null)을 허용하는 외래 키 값의 필요성에 직면, 제로 수 있습니다.

    그러나 대답은 모두가 비즈니스에 달려있다.

  10. ==============================

    10.외래 키의 아이디어는 이미 기본 테이블에 존재하는 값을 참조의 개념을 기반으로합니다. 그것이 다른 테이블의 외래 키라고 이유입니다. 이 개념은 참조 무결성이라고합니다. 외부 키가 널 필드로 선언 된 경우 참조 무결성의 매우 논리를 위반하는 것입니다. 무슨 다음을 참조 할 것인가? 그것은 단지 기본 테이블에 존재하는 무언가를 참조 할 수 있습니다. 따라서, 나는 널 (null)로 외래 키 필드를 선언 잘못 될 것 같아요.

    외래 키의 아이디어는 이미 기본 테이블에 존재하는 값을 참조의 개념을 기반으로합니다. 그것이 다른 테이블의 외래 키라고 이유입니다. 이 개념은 참조 무결성이라고합니다. 외부 키가 널 필드로 선언 된 경우 참조 무결성의 매우 논리를 위반하는 것입니다. 무슨 다음을 참조 할 것인가? 그것은 단지 기본 테이블에 존재하는 무언가를 참조 할 수 있습니다. 따라서, 나는 널 (null)로 외래 키 필드를 선언 잘못 될 것 같아요.

  11. ==============================

    11.나는 nulls.So가 외부 키에 널 (null) 값을 갖는 전혀 문제가 없다 할 수 없습니다 다른 table.So 한 또한 테이블 기본 키 외래 키를 생각합니다.

    나는 nulls.So가 외부 키에 널 (null) 값을 갖는 전혀 문제가 없다 할 수 없습니다 다른 table.So 한 또한 테이블 기본 키 외래 키를 생각합니다.

  12. from https://stackoverflow.com/questions/7573590/can-a-foreign-key-be-null-and-or-duplicate by cc-by-sa and MIT license