2015-01-15 4 views
0

2 개의 테이블이 있습니다. userspost. post(user_id) 란에 users(id) 칼럼 (pk)을 외래 키로 사용하고 싶습니다. 내가 사용 :MySql : 외래 키가 null 인 이유는 무엇입니까?

ALTER TABLE post ADD FOREIGN KEY (user_id) REFERENCES users(id); 

그 작업이 오류없이 성공했지만 난 단지 null(user_id)에서 열을 참조하십시오. 내가 무엇인가 놓치지 않습니까? users 테이블의 id 값을 복사해서는 안됩니까?

+0

복사 방법? DB는 어떤 사용자가 어떤 게시물을 게시했는지 어떻게 알 수 있습니까? 이전에 열에 'null'이 포함되어 있으면 DB에서 채울 수 없습니다. –

+0

새 사용자를 등록하고 새 게시물을 만들 때 여전히 'null'을 표시합니다. 어떤 사용자가 해당 게시물을 작성했는지 알아 보려면 어떻게해야합니까? – oxyt

+0

외래 키는 'NULL'일 수 있습니다. 기본 키는 사용할 수 없습니다. –

답변

1

Q : 외래 키가 null 인 이유는 무엇입니까?

A : 열에 NULL 값이 포함될 수 있는지 여부는 NOT NULL 제약 조건의 유무에 의해 결정됩니다. 이는 열이 외래 키 제약 조건에서 참조되는지 여부와는 완전히 별개입니다.

행이 삽입 될 때 할당 된 값이기 때문에 열의 값이 NULL입니다. 값이 명시 적으로 설정되었는지 또는 열의 기본값에서 파생되었는지 여부에 관계없이 값이 지정되었습니다. (열이 기존 테이블에 추가 된 경우, 새로운 열의 값은 열의 기본값이었다.)

-

Q : 내가 뭔가 또는 무엇을 그리워 하는가?

대답 : 관찰 한 행동과 결과는 예상대로입니다.

Q : 사용자 테이블에서 id 값을 복사하면 안됩니까?

A : MySQL은 자동으로 post 테이블의 user_id 열을 채우는해야하는지 여부를 묻는 경우는, 그 질문에 대한 대답은해야하지, 아니입니다.

난 당신이 핵심 아이디어에 흘려 주기도했습니다 어쩌면 생각 :

다른 테이블의 행을 하나 개의 테이블에있는 행 사이의 "관계"

공통 값을 저장하여 관계형 데이터베이스에 표시됩니다.

그러나 데이터베이스는 어떤 행이 어떤 행과 관련이 있는지 알지 못합니다. 당신은 그것을 말해야합니다. 그 정보를 제공해야합니다.

post 테이블에 행을 삽입 할 때 user_id 열의 값을 제공 할 수 있습니다. 일부 행의 id 값과 동일한 값을 user에 입력하십시오.

FOREIGN KEY 제약 조건은 제한 사항입니다. 유효한 값만 허용합니다. 유효하지 않은 값이 저장되는 것을 방지합니다. (MyISAM이 외래 키 제약을 시행하지 않기 때문에 FOREIGN_KEY_CHECKS = 1 인 경우 InnoDB에 해당합니다. MyISAM은 외래 키 제약 조건을 적용하지 않기 때문에 MyISAM에는 해당되지 않습니다.)

외래 키는 저장할 수있는 값을 "제한"하려고한다는 것입니다.post의 행에 값이 있고 users 테이블의 "누락 된"행을 가리키는 값을 허용하지 않는다고 말합니다.

NULL을 외래 키 열에 저장할 수 있습니다. NULL 값이 저장되면 행이 이 아니며 users 테이블의 행과 관련된이 아님을 나타냅니다.

열에 NULL 값을 허용하지 않는 것은 다른 종류의 제약 조건 인 NOT NULL 제약 조건으로 수행됩니다.

외래 키 제약 을 같은 열에 NOT NULL 제약 조건으로 정의 할 수 있습니다. 그것은 NULL 값을 허용할지 여부와 상관없이 디자인 결정입니다. 경우에 따라 외래 키에서 NULL 값을 허용하지 않을 수 있습니다. 예를 들어, postuser_id 열에 NOT NULL 제약 조건을 추가하면 행과 관련이없는 행이 post에 존재할 수 없다는 것이 효과적입니다. 그리고 그것은 매우 일반적인 패턴입니다.

-1

MySQL의 임의의 열에 외래 키를 추가해도 값이 복사되지 않습니다.

관련 문제