코딩기록
[MYSQL] 한 컬럼에 저장된 회원 닉네임과 비회원ID를 각 컬럼에 나누기(Stored Procedure) 본문
1. 이슈
농구장 위치공유 서비스는 최초엔 비회원 서비스를 계획하고 테이블을 구축하였는데, 추후 회원가입 기능을 구현하게 되어서, 농구장 정보를 수정한 유저 정보 컬럼에 회원 정보와 비회원 정보가 동시에 입력되게 되었다.
즉, 비회원 유저가 농구장 정보를 수정하면 lastChangeUser 컬럼에 비회원ID가 저장되고, 회원 유저가 농구장 정보를 수정해도 같은 컬럼에 회원의 닉네임이 저장되는 상태였다.
두 데이터의 성질이 다르므로, 각각 컬럼을 나누어 저장하는 것이 맞다. 이 상태에선 회원 유저가 닉네임을 수정하면 수정된 닉네임이 농구장 정보 테이블에 반영되지 않는다.
2. 해결
농구장 정보 테이블에 회원ID가 저장될 user_id 컬럼과 비회원ID가 저장될 anonymous_id 컬럼을 새롭게 만들었다.
그 후 기존에 위와 같이 lastChangeUser 데이터들을 두 컬럼에 옮기는 작업을 MySQL Stored Procedure를 통해 진행했다. 저장된 lastChangeUser 데이터가 users 테이블의 닉네임에 존재한다면 그 user의 id를 user_id에 저장하고, 존재하지 않는다면 lastChangeUser 데이터가 비회원ID이므로 anonymous_id 컬럼에 저장한다.
아래는 위 내용을 실행하는 MySQL 프로시저 저장함수 명령어이다.
delimiter $$
drop procedure IF EXISTS setting_user_and_anonymous$$
create procedure setting_user_and_anonymous()
BEGIN
declare i int default 1;
declare j int default (select max(id) from hoops);
while (i <= j) do
update hoops set user_id =
CASE
WHEN ((select count(*) from users where nick_name = (select lastChangeUser from (select lastChangeUser from hoops where id = i) as hoops)) >= 1)
THEN (select id from users where nick_name = (select lastChangeUser from (select lastChangeUser from hoops where id = i) as hoops))
ELSE null
END
, anonymous_id =
CASE
WHEN ((select count(*) from users where nick_name = (select lastChangeUser from (select lastChangeUser from hoops where id = i) as hoops)) >= 1)
THEN null
ELSE (select lastChangeUser from (select lastChangeUser from hoops where id = i) as hoops)
END
where id = i;
SET i = i + 1;
END WHILE;
END $$
delimiter ;
3. 결과
다음과 같이 잘 수정되었다.
'백엔드 > DB' 카테고리의 다른 글
[MySQL] 테이블에 ON DELETE CASCADE 설정하기 (0) | 2024.01.13 |
---|