외래 키가 동일한 테이블의 기본 키를 참조 할 수 있습니까?
외래 키에는 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
테이블을
Parent
및
Child
테이블 로 정규화 할 필요가 없습니다
.
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를 참조하는 행).
'programing' 카테고리의 다른 글
화면에 PIL 이미지를 표시하는 방법은 무엇입니까? (0) | 2021.01.14 |
---|---|
특정 줄에 공백이있는 sed 삽입 줄 (0) | 2021.01.14 |
Android Studio를 업데이트 할 수 없음-다운로드 만 (0) | 2021.01.14 |
START_OBJECT 토큰에서 java.lang.String 인스턴스를 역 직렬화 할 수 없습니다. (0) | 2021.01.14 |
Node.js 형식의 콘솔 출력 (0) | 2021.01.14 |