CRUD 게시판을 만들면서 MySQL에서 뚱땅거린 것을 기록하는 포스트입니다.
CREATE TABLE board
(
idx int AUTO_INCREMENT PRIMARY KEY ,
name varchar(50),
title varchar(50),
content mediumtext,
regdate datetime,
modidate datetime,
hit int,
recommend int,
nick varchar(50)
)
ALTER TABLE board
ADD CONSTRAINT userID FOREIGN KEY(name)
REFERENCES users(ID) ON DELETE CASCADE;
board 테이블의 idx는 작성될 때마다 자동으로 증가되도록 AUTO_INCREMENT를 가집니다.
회원 ID 컬럼과 board 테이블의 name끼리 참조를 맺고
위의 쿼리와 같이 ON DELETE CASCADE 처리를 통해 회원 탈퇴시 해당 회원의 작성글들이 연계되어 삭제되도록 했습니다.
완성된 board 테이블 구조입니다.
이전 포스트와는 다르게, ID 별 닉네임을 설정할 수 있도록 컬럼을 추가했습니다.
게시판을 구현하고 CRUD 테스트 진행 중
위와 같이 번호가 스킵이 되는 현상이 발생했습니다.
해당 현상을 해결하는 쿼리는 아래와 같습니다.
SET @COUNT =0; // A
UPDATE board SET board.idx = @COUNT:=@COUNT+1; // B
ALTER TABLE board AUTO_INCREMENT=?; // C
A에서 @는 SQL 쿼리 내 변수 선언 기호입니다. 즉, COUNT란 변수에 0을 넣습니다.
B는 board 테이블의 idx 컬럼 값을 0부터 증가시키며 변경합니다.
C는 다음 자동으로 증가될 AUTO_INCREMENT를 사용자가 직접 지정합니다.
예를 들어 현재 게시글 번호가 3이라면 '?'엔 3보다 큰 숫자만 지정할 수 있습니다.
상단의 쿼리를 통해 잘 정리된 것을 볼 수 있습니다.
만약 AUTO_INCREMENT=10 이라고 한 뒤 글을 쓰면 다음과 같이 나옵니다.
SET @COUNT =0;
UPDATE board SET board.idx = @COUNT:=@COUNT+1;
위의 UPDATE 문은 테이블의 전체 컬럼을 변경합니다.
이에 대해 MySQL은 기본적으로 Safe mode가 지정되어있어 WHERE절이 없으면 쿼리 실행을 막아버립니다.
you are using safe update mode.... 라는 문장이 나오며,
상단 Edit > Preference > SQL Editor > Safe Updates 체크 해제
를 통해 해제하여 해결했습니다.
물론 해당 기능 이용 후 다시 체크했습니다. 언제나 전체 삭제는 무섭습니다..
현재 CRUD 게시판 및 페이징까지 모두 완료한 상태로 각 기능별로 post를 업로드할 예정입니다.
대부분 알아서 궁리했지만, 막히는 부분이 있을 땐 고코더님의 Nodejs 관련 포스트를 읽고 잘 이해할 수 있었습니다. 감사합니다.