programing

외부 키는 NULL 또는 중복할 수 있습니까?

newnotes 2023. 4. 5. 22:12
반응형

외부 키는 NULL 또는 중복할 수 있습니까?

두 가지 사항을 명확히 해 주십시오.

  1. 외부 키는 NULL로 할 수 있습니까?
  2. 외부 키를 복제할 수 있습니까?

가 as as as as as as asNULL수 만, 제 에서는 입력이 NULLOracle SQL Server の oracle oracle oracle 。

간단한 답변:네, NULL 또는 중복일 수 있습니다.

외부 키가 null이어야 하거나 고유하거나 고유하지 않아야 하는 이유를 설명합니다.먼저 Foreign 키에서는 해당 필드의 값이 먼저 다른 테이블(부모 테이블)에 존재해야 합니다.그것이 FK의 정의이다.정의상 Null은 값이 아닙니다.Null은 값이 무엇인지 아직 모른다는 것을 의미합니다.

실제 사례를 하나 들어보겠습니다.판매 제안을 저장하는 데이터베이스가 있다고 가정합니다.각 제안서에 영업사원이 1명, 고객이 1명만 할당되어 있다고 가정합니다.따라서 제안 테이블에는 두 개의 외부 키가 있습니다. 하나는 클라이언트 ID와 다른 하나는 영업 담당자 ID는 두 개입니다.단, 레코드가 작성될 때 (아직 작업을 할 수 있는 사람이 없기 때문에) 항상 영업사원이 할당되는 것은 아니기 때문에 클라이언트 ID는 입력되지만 영업사원 ID는 null일 수 있습니다.즉, 데이터를 입력할 때 값을 알 수 없지만 테이블에서 입력해야 하는 다른 값을 알고 있는 경우에는 보통 null FK를 가질 수 있는 기능이 필요합니다.일반적으로 FK에서 null을 허용하려면 FK가 있는 필드에서 null을 허용하기만 하면 됩니다.null 값은 FK라는 개념과는 별개입니다.

이것이 일의인지 아닌지는 테이블이 부모 테이블과1 대 1의 관계인지1 대 다의 관계인지와 관계가 있습니다.일대일 관계인 경우 데이터를 모두 한 테이블에 포함할 수 있지만 테이블이 너무 넓어지거나 데이터가 다른 주제(예: 직원 - 보험 예 @tbone 제공)에 있는 경우에는 FK를 사용하여 별도의 테이블을 사용할 수 있습니다.그런 다음 이 FK를 PK(일관성을 보증)로도 만들거나 고유한 제약을 가할 수 있습니다.

대부분의 FK는 1대 다의 관계를 위한 것이며, 이는 필드에 더 이상의 제약을 가하지 않고 FK에서 얻을 수 있는 것입니다.예를 들어 주문표와 주문상세표가 있습니다.고객이 한 번에 10개의 아이템을 주문하는 경우 동일한 주문이 포함된 하나의 주문과 10개의 주문 상세 레코드가 있습니다.FK로서의 ID.

1 - 네, SQL Server 2000 이상부터.

- 네,2 - 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.UNIQUE구속조건 또는 고유 인덱스에 링크되어 있습니다.

네, 외부 키는 상급 프로그래머가 위에서 말한 것처럼 null일 수 있습니다.Foreign 키가 null이어야 하는 다른 시나리오를 추가하겠습니다.사진이나 비디오에 대한 코멘트를 허용하는 어플리케이션에 테이블 코멘트, 사진 및 비디오가 있다고 가정해 보겠습니다.코멘트 테이블에는 2개의 외부 키 PicturesId와 VideosId를 프라이머리 Key CommentId와 함께 사용할 수 있습니다.따라서 비디오에 코멘트를 할 때는 VideosId만 필요하며 pictureId는 null이 됩니다.사진에 댓글을 달면 PictureId만 필요하고 VideosId는 null이 됩니다.

로 하느냐에 foreign key당신의 관계와 관련이 있습니다.

  1. foreign key도 합니다.key attribute이 될 수 .
  2. foreign key NULL, NULL 의 어트리뷰트입니다.

신탁을 사용하다
를 위한 표를 만들어 카운트

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

DENTION 테이블을 만듭니다.

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 ) ;

이것은 Oracle에서 완벽하게 작동합니다.주의: 국가_두 번째 테이블의 ID 외부 키에 "NOT NULL"이 없습니다.

이제 DEOUNT 테이블에 행을 삽입하려면 DOUNT_ID만 지정하면 됩니다.단, COUNTRY_를 지정한 경우ID도 COUNTRY 테이블에 이미 존재해야 합니다.

기본적으로는 외부 키에는 제약이 없으며 외부 키는 null로 중복될 수 있습니다.

테이블을 만들거나 테이블을 변경하는 동안 고유성 또는 null이 아닌 제약조건을 추가하면 null/복제값은 허용되지 않습니다.

간단히 말해 엔티티 간의 "비식별" 관계는 ER-Model의 일부이며 ER-Diagram을 설계할 때 Microsoft Visio에서 사용할 수 있습니다.이는 "0 또는 0보다 크거나" 또는 "0 또는 1" 유형의 엔티티 간에 카디널리티를 적용하기 위해 필요합니다."1 to many"의 "1"이 아닌 카디널리티의 "0"에 주목하십시오.

여기서 카디널리티가 "제로"(비식별)일 수 있는 비식별 관계의 예로는 A 또는 A가 다른 엔티티 B의 레코드에 대한 참조로서 값을 가질 수 있는 경우를 들 수 있습니다.

A사의 한 기록이 다른 B사의 기록과 자신을 식별할 가능성이 있으므로, B사의 기록의 식별가치를 나타내는 열이 B사에 있어야 한다.엔티티-A의 레코드가 엔티티-B의 레코드(또는 객체/초)를 식별하지 않는 경우 이 열은 "Null"일 수 있습니다.

오브젝트 지향(실제) 패러다임에서는 클래스 B의 오브젝트가 반드시 클래스 A의 오브젝트에 의존하지 않는(강하게 결합되어 있는) 상황이 있습니다.즉, 클래스 B는 클래스 A의 오브젝트를 "포함"(포함)할 수 있도록 클래스 A와 느슨하게 결합되어 있습니다.클래스 B의 오브젝트 개념과는 달리 클래스 B의 오브젝트 작성에는 클래스 A의 오브젝트(구성)가 있어야 한다.

SQL 쿼리의 관점에서 엔티티 B용으로 예약된 외부 키에 대해 "null이 아닌" 엔티티 B 내의 모든 레코드를 쿼리할 수 있습니다.이렇게 하면 엔티티-A의 행에 대응하는 값이 있는 모든 레코드가 엔티티-B의 엔티티-A에 값이 없는 레코드가 됩니다.

외부 키는 NULL로 할 수 있습니까?

기존 답변은 단일 컬럼 시나리오에 초점을 맞췄습니다.다중 열 외부 키를 고려하는 경우 다음을 사용하여 더 많은 옵션을 사용할 수 있습니다.MATCH [SIMPLE | PARTIAL | FULL]SQL Standard에 정의된 절:

PostgreSQL-CREATE 테이블

참조 열에 삽입된 값은 지정된 일치 유형을 사용하여 참조된 테이블 및 참조된 열의 값과 일치합니다.MATCH FULL, MATCH PARTIAL 및 MATCH SIMPLE(기본값)의 3가지 매치가 있습니다.MATCH FULL 에서는 모든 외부 키 열이 null이 아닌 한 여러 개의 외부 키 열이 null이 될 수 없습니다.모두 null인 경우 참조된 테이블에서 행이 일치할 필요는 없습니다.MATCH SIMPLE 에서는 외부 키열 중 하나를 늘로 할 수 있습니다.이들 중 하나가 늘인 경우 참조된 테이블에서 행을 일치시킬 필요는 없습니다.MATCH PARTIAL은 아직 구현되지 않았습니다.

(물론 NOT NULL 제약조건을 참조 열에 적용하여 이러한 사례가 발생하지 않도록 할 수 있습니다.)

예:

CREATE TABLE A(a VARCHAR(10), b VARCHAR(10), d DATE , UNIQUE(a,b));
INSERT INTO A(a, b, d) 
VALUES (NULL, NULL, NOW()),('a', NULL, NOW()),(NULL, 'b', NOW()),('c', 'b', NOW());

CREATE TABLE B(id INT PRIMARY KEY, ref_a VARCHAR(10), ref_b VARCHAR(10));

-- MATCH SIMPLE - default behaviour nulls are allowed
ALTER TABLE B ADD CONSTRAINT B_Fk FOREIGN KEY (ref_a, ref_b) 
REFERENCES A(a,b) MATCH SIMPLE;

INSERT INTO B(id, ref_a, ref_b) VALUES (1, NULL, 'b');  

-- (NULL/'x') 'x' value does not exists in A table, but insert is valid
INSERT INTO B(id, ref_a, ref_b) VALUES (2, NULL, 'x');  

ALTER TABLE B DROP CONSTRAINT IF EXISTS B_Fk; -- cleanup

-- MATCH PARTIAL - not implemented
ALTER TABLE B ADD CONSTRAINT B_Fk FOREIGN KEY (ref_a, ref_b) 
REFERENCES A(a,b) MATCH PARTIAL;
-- ERROR:  MATCH PARTIAL not yet implemented

DELETE FROM B; ALTER TABLE B DROP CONSTRAINT IF EXISTS B_Fk; -- cleanup

-- MATCH FULL nulls are not allowed
ALTER TABLE B ADD CONSTRAINT B_Fk FOREIGN KEY (ref_a, ref_b) 
REFERENCES A(a,b) MATCH FULL;

-- FK is defined, inserting NULL as part of FK
INSERT INTO B(id, ref_a, ref_b) VALUES (1, NULL, 'b');
-- ERROR:  MATCH FULL does not allow mixing of null and nonnull key values.

-- FK is defined, inserting all NULLs - valid
INSERT INTO B(id, ref_a, ref_b) VALUES (1, NULL, NULL);

db <> 데모 표시

표에 있는 가능한 카디널리티를 고려하는 것이 좋을 것 같습니다.가능한 최소 카디널리티 0을 가질 수 있습니다.옵션인 경우 관련 테이블의 최소 튜플 참여는 0이 될 수 있습니다.이제 외부 키 값을 null로 허용해야 합니다.

하지만 정답은 모든 것이 비즈니스에 달려있다는 것입니다.

외부 키의 개념은 메인 테이블에 이미 존재하는 값을 참조하는 개념을 기반으로 합니다.그래서 다른 테이블에서는 외부 키라고 부릅니다.이 개념을 참조 무결성이라고 합니다.외부 키가 null 필드로 선언되면 참조 무결성의 논리에 위배됩니다.어떤 의미일까요?이것은 메인 테이블에 있는 것만을 나타낼 수 있습니다.따라서 외부 키 필드를 null로 선언하는 것은 잘못되었다고 생각합니다.

한 테이블의 외부 키도 다른 테이블의 기본 키라고 생각합니다.그래서 null을 허용하지 않습니다.따라서 외부 키에서 null 값을 갖는다는 것은 의심의 여지가 없습니다.

언급URL : https://stackoverflow.com/questions/7573590/can-a-foreign-key-be-null-and-or-duplicate

반응형