지난 포스팅 글에서 구성한 table은 POST_LIKES 이다.
기존 table에서 foreign key를 생성했을 때 상위 테이블의 참조하는 행이 지워지거나 수정될 때를 고려하지 않고 default(no action)로 만들었다.
그래서 foreign key가 뭔지 action이 뭔지 조사하고 alter문으로 수정하는 과정을 거쳤다.
Foreign Key 정의 (in wiki)
생성 방법
CREATE TABLE 테이블이름
(
필드이름 필드타입,
...,
[CONSTRAINT 제약조건이름]
FOREIGN KEY (필드이름)
REFERENCES 테이블이름 (필드이름)
)
참조되는 테이블 값이 변경되면 참조하고 있는 하위 테이블의 데이터를 어떻게 처리할 것인가? 이것에 대한 처리를 제약 조건 생성 시 미리 설정할 수 있다. delete/update 둘 다 같은 동작 종류가 있다.
ALTER 문은 column 필드로 제거/추가/수정할 때 사용한다. 이 때 foreign key constraint도 설정 가능하다.
ALTER TABLE 테이블이름
ADD [CONSTRAINT 제약조건이름]
FOREIGN KEY (필드이름)
REFERENCES 테이블이름 (필드이름)
실제 적용한 룰은 다음과 같다. postgre sql이라 mysql과 다를 수 있다.
ALTER TABLE IF EXISTS public."POST_LIKES"
DROP CONSTRAINT fk_post_id,
ADD CONSTRAINT fk_post_id FOREIGN KEY (fk_post_id)
REFERENCES public."BLOG_POSTS" (id) MATCH SIMPLE
ON UPDATE CASCADE
ON DELETE CASCADE
NOT VALID;
/readingList/:userName/liked/
-> /:userName/readingList/liked/
useEffect(() => {
axios({
baseURL: API_HOST,
url: `/@${userId}/${urlSlug}`,
})
.then(response => {
setPost(response.data);
})
.catch(error => {
console.error(error);
});
}, [userId, urlSlug]);
useEffect(() => {
axios({
baseURL: API_HOST,
url: `/${userId}/liked/${post.id}`,
}).then(reponse => {
setLiked(reponse.data.length !== 0);
});
}, [post.id, userId]);
const handleLikeToggle = () => {
setLiked(!liked);
};
return (
<div>
<PostHeader title={post.title} date={post.released_at} userName={userId || ''} />
<PostBody>
<PostLikeShareButton likeCount={post.likes} liked={liked} onLikeToggle={handleLikeToggle} />
<PostBodyBox>{post.body && <ViewBody body={post.body} />}</PostBodyBox>
</PostBody>
</div>
);
https://ko.wikipedia.org/wiki/%EC%99%B8%EB%9E%98_%ED%82%A4
http://www.tcpschool.com/mysql/mysql_constraint_foreignKey
https://stackoverflow.com/questions/1067016/join-queries-vs-multiple-queries