programing

외래 키가 동일한 테이블의 기본 키를 참조 할 수 있습니까?

javaba 2021. 1. 14. 23:06
반응형

외래 키가 동일한 테이블의 기본 키를 참조 할 수 있습니까?


외래 키에는 uniqueness속성 이 없기 때문에 대답이 거짓이라고 생각합니다 .

그러나 어떤 사람들은 스스로 테이블에 합류하는 경우가 될 수 있다고 말했습니다. 나는 SQL. 사실이라면 그 이유와 방법을 설명해주십시오.

Employee table
| e_id | e_name  | e_sala  |  d_id  |
|----  |-------  |-----    |--------|
|  1   |   Tom   |  50K    |    A   |
|  2   | Billy   |  15K    |    A   |
|  3   | Bucky   |  15K    |    B   |


department table
| d_id | d_name  |
|----  |-------  |
|  A   |   XXX   | 
|  B   |   YYY   | 

이제 d_id는 외래 ​​키이므로 기본 키가 될 수 있습니다. 그리고에 대해 설명하십시오 join. 그 용도는 무엇입니까?


질문이 약간 혼란 스럽다고 생각합니다.

"외래 키가 동일한 테이블의 기본 키를 '참조'할 수 있습니까?"를 의미하는 경우 일부 응답에 따르면 대답은 확고한 예입니다. 예를 들어, 직원 테이블에서 직원에 대한 행에는 관리자가 직원이기도 한 관리자의 직원 번호를 저장하는 열이있을 수 있으므로 다른 직원의 행처럼 테이블에 행이 있습니다.

"열 (또는 열 집합)이 동일한 테이블에서 기본 키이자 외래 키가 될 수 있습니까?"를 의미하는 경우, 제 생각에는 대답은 아니오입니다. 무의미 ​​해 보입니다. 그러나 다음 정의는 SQL Server에서 성공합니다!

create table t1(c1 int not null primary key foreign key references t1(c1))

그러나 누군가가 실제적인 예를 제시하지 않는 한 그러한 제약을 갖는 것은 무의미하다고 생각합니다.

AmanS, 귀하의 예에서 d_id는 어떤 상황에서도 Employee 테이블의 기본 키가 될 수 없습니다. 테이블에는 하나의 기본 키만있을 수 있습니다. 나는 이것이 당신의 의심을 없애기를 바랍니다. d_id는 부서 테이블에서만 기본 키일 수 있습니다.


물론입니다. 하자 당신은이 말 Person과 함께, 테이블 id, name, age,와 parent_id, 어디에 parent_id같은 테이블에 외래 키입니다. Person테이블을 ParentChild테이블 로 정규화 할 필요가 없습니다 .

Person
| id |  name | age | parent_id |
|----|-------|-----|-----------|
|  1 |   Tom |  50 |      null |
|  2 | Billy |  15 |         1 |

이 같은.

일관성을 유지하려면에 대해 적어도 1 개의 null 값이 parent_id있어야합니다. 하나의 "알파 수컷"행.

편집 : 의견이 보여 주듯이 Sam은 이것을하지 않는 좋은 이유를 찾았습니다. MySQL에서 기본 키를 편집하려고 할 때 지정하더라도 CASCADE ON UPDATE편집 내용이 제대로 전파되지 않는 것 같습니다. 기본 키는 (보통) 프로덕션에서 편집 할 수있는 제한이 없지만 무시해서는 안됩니다. 따라서 나는 내 대답을 다음과 같이 변경합니다 .- 프로덕션 시스템을 매우 엄격하게 제어하지 않는 한 (그리고 아무도 PK를 편집하는 제어를 구현하지 않을 것임을 보장 할 수없는 경우) 이 관행을 피해야합니다 . MySQL 외부에서 테스트하지 않았습니다.


예 : 범주에 대한 n 하위 범주 수준. 아래 테이블 기본 키 ID 는 외래 키 sub_category_id에 의해 참조됩니다.

여기에 이미지 설명 입력


이것은 좋은 설명 예일 수 있습니다.

CREATE TABLE employees (
id INTEGER NOT NULL PRIMARY KEY,
managerId INTEGER REFERENCES employees(id), 
name VARCHAR(30) NOT NULL
);

INSERT INTO employees(id, managerId, name) VALUES(1, NULL, 'John');
INSERT INTO employees(id, managerId, name) VALUES(2, 1, 'Mike');

-설명 :-이 예에서. -John은 Mike의 매니저입니다. Mike는 누구도 관리하지 않습니다. -Mike는 아무도 관리하지 않는 유일한 직원입니다.


외래 키와 같은 테이블에있는 다른 행의 ID를 사용하는 좋은 예는 중첩 된 목록입니다.

하위 (예 : 상위 ID를 참조하는 행)가 있고 하위 (예 : 하위 ID 참조)도있는 행을 삭제하면 계단식 행이 삭제됩니다.

이것은 많은 고통을 덜어 줄 것입니다 (그리고 고아로 무엇을해야하는지에 대한 많은 코드-즉, 존재하지 않는 ID를 참조하는 행).

참조 URL : https://stackoverflow.com/questions/18680680/can-a-foreign-key-refer-to-a-primary-key-in-the-same-table

반응형