[MySQL] 프로시저로 더미데이터 삽입하기

dondonee·2024년 6월 30일
0
post-thumbnail

프로시저로 더미데이터 삽입하기

프로시저를 이용해 게시판 프로젝트에 넣을 더미데이터를 만들어보았다. 프로시저 문법이 익숙하지 않아 계속 문법 오류가 발생해서 시간이 좀 걸렸다. 다음을 위해 정리해둔다.


MySQL 콘솔에서 적용하기

mysql> DELIMITER //

콘솔에 접속한 뒤 먼저 USE 키워드를 통해 사용할 데이터베이스를 선택한다.

DELIMITER는 구문 종료 문자를 지정하는 키워드이다. 기본적으로는 ;인데 //로 변경했다. $$로 사용하는 사람들도 많았다. 왜 변경해야 하는지는 프로시저 구문을 보면 이해가 된다.


mysql> DROP PROCEDURE IF EXISTS postLoop//
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CREATE PROCEDURE IF NOT EXISTS postLoop()
    -> BEGIN
    -> DECLARE i INT DEFAULT 1;
    -> WHILE i <= 50 DO
    -> INSERT INTO post(topic, title, content, author_id, created_date) 
    -> VALUES ('C-LIFE', CONCAT('제목 ', i), '예시입니다.', 3, NOW());
    -> SET i = i + 1;
    -> END WHILE;
    -> END;//
Query OK, 0 rows affected (0.01 sec)

DROP PROCEDURE는 동일한 이름의 프로시저가 있을 수도 있으니 넣어준다. DELIMITER를 변경했으므로 쿼리 끝에 ; 대신 // 기호를 통해 쿼리 구문의 끝을 알린다.

CREATE PROCEDURE로 새 프로시저를 만들어주자. IF NOT EXISTS를 넣어주자. 나는 이 키워드를 넣지 않았다가 하나의 프로시저를 중복 호출해 수정해야 했다(밑에서 소개).


이 프로시저는 WHILE DO 반복문을 통해 50개의 더미데이터를 삽입하는 프로시저이다.

  • BEGIN END : 프로시저를 묶어주는 키워드이다. 트랜잭션을 생각하면 될 것 같다.
  • DECLARE i INT DEFAULT 1 : i 변수를 지정해준다. 나는 더미데미터의 제목 옆에 1부터 50까지 번호를 붙여주기 위해 1부터 시작했다.
  • WHILE i <= 50 DO END WHILE : i50과 같을 때까지 내부의 구문을 반복한다.
    • INSERT INTO : 데이터를 삽입한다. CONCAT()은 문자열을 연결하는 함수다. '제목 1' ~ '제목 50'과 같은 형태로 삽입하기 위한 것이다. i INT는 문자열로 자동 형변환 된다.
    • SET i = i + 1 : 반복문 변수를 1씩 증가시킨다.
  • END;// : 프로시저의 끝이므로 //를 통해 프로시저의 끝임을 알려준다.

mysql> DELIMITER ;

DELIMITER를 변경하지 않았다면 MySQL은 프로시저 내부의 ;마다 구문 종료로 인식해 쿼리를 하나씩 실행하려고 해서 오류가 발생한다. 따라서 DELIMITER를 임시로 //로 변경하여 내부의 구문들이 따로 실행되지 않게 해서 하나의 프로시저로 묶는 것이다.

프로시저가 끝났다면 DELIMITER;로 되돌려주자.


mysql> CALL postLoop;
Query OK, 1 row affected (0.07 sec)

생성한 프로시저를 실행한다.



42000 오류

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'end' at line 1

계속 위와 같은 오류가 떴는데 문법 오류라고 하면서 MySQL 버전을 체크해 보라고 했다. 버전 호환 문제인가 했는데 단순히 문법 오류여도 저렇게 나온다.



DBeaver에서 적용하기

콘솔은 빨라서 좋지만 컬럼이 많고 데이터가 많아지면 보기가 불편하기 때문에 DBeaver에서도 사용해보았다.

먼저 원격 커넥션을 만들어 주어야 한다. (이전 포스팅 참고 : 🔗 [MySQL] 원격 DB 접속하기)


프로시저 생성

Procedures 마우스 오른쪽 클릭하고 Create New Procedure을 눌러 새 프로시저를 생성한다.


프로시저 스크립트를 만들고 저장 버튼을 누른다. 문법이 정확해야 저장이 된다. (여기서 프로시저 생성에 IF NOT EXIST를 쓰지 않아 문제가 생겼다.)


잘 삽입이 되었다.



수정 쿼리

1~50번 게시글을 만들었는데 51~100번 게시글도 추가하고 싶어 동일한 프로시저 스크립트에서 i만 바꾸어 실행했다.

그런데 DROP이 제대로 되지 않았는지 수정되지 않은 프로시저가 또 실행되어 1~50번 게시글이 두 번 삽입되어 버렸다. CREATE PROCEDUREIF NOT EXIST 옵션을 넣었다면 좋았을 것이다.


DELIMITER //
DROP PROCEDURE IF EXISTS postUpdateLoop;
CREATE PROCEDURE IF NOT EXISTS postUpdateLoop()

BEGIN
DECLARE num INT DEFAULT 51;
DECLARE i INT DEFAULT 0;
	WHILE i < 50 DO
		UPDATE post SET title = CONCAT('교재 팝니다. ', num + i) WHERE post_id = 203 + i;
		SET i = i + 1;
	END WHILE;
END;

DELIMITER ;

CALL postUpdateLoop;

위와 같이 UPDATE 프로시저를 작성하여 중복 삽입된 '제목 1' ~ '제목 50'의 게시물을 '제목 51' ~ '제목 100'으로 수정하였다.



0개의 댓글