제 유튜브 채널을 통해 강좌로 소개할 것들에 대해 먼저 결과 만을 찍어 먼저 올려 봅니다. 아마 바로 돌아오는 이번주 토요일 쯤.. 아래 2개 중 한 개를 찍어 올릴 듯 합니다.
제 유튜브 채널 이름은 GIS Developer 입니다. 채널을 구독하시면 영상 업로드 시 바로 알 수 있습니다.

공간정보시스템 / 3차원 시각화 / 딥러닝 기반 기술 연구소 @지오서비스(GEOSERVICE)
제 유튜브 채널을 통해 강좌로 소개할 것들에 대해 먼저 결과 만을 찍어 먼저 올려 봅니다. 아마 바로 돌아오는 이번주 토요일 쯤.. 아래 2개 중 한 개를 찍어 올릴 듯 합니다.
제 유튜브 채널 이름은 GIS Developer 입니다. 채널을 구독하시면 영상 업로드 시 바로 알 수 있습니다.

먼저 다음과 같은 테이블이 있습니다.
-- DIRECTORY
CREATE TABLE directory (
id INTEGER, -- 디렉토리 ID
parent_id INTEGER, -- 부모 디렉토리 (null 값일 때 루트)
user_id INTEGER NOT NULL, -- 사용자 ID
PRIMARY KEY (id, user_id),
CONSTRAINT fk_parent_i FOREIGN KEY(user_id, parent_id) REFERENCES directory(user_id, id) ON DELETE CASCADE
);
그리고 이 테이블에 데이터를 추가하는 함수는 다음과 같습니다.
-- 신규 데이터 추가 함수
CREATE OR REPLACE FUNCTION add(_parent_id INTEGER, _user_id INTEGER) RETURNS INTEGER
LANGUAGE plpgsql AS $$
DECLARE
max_id INTEGER;
next_id INTEGER;
BEGIN
-- 해당 user에 대해서 최대값의 id 값을 구해서 max_id 변수에 할당
SELECT MAX(id) INTO max_id FROM directory WHERE user_id = _user_id;
IF max_id IS NULL THEN -- max_id 값이 없다면
next_id := 0; -- 다음 id 값은 0으로 할당
ELSE
next_id := max_id + 1; -- 다음 id 값은 최대값에 1을 더해서 할당
END IF;
-- 다음 id 값을 콘솔에 출력해서 확인
RAISE NOTICE 'next_id = %', next_id;
-- 다음 id 값으로 데이터 추가
INSERT INTO directory VALUES (next_id, _parent_id, _user_id);
-- 다음 id 값 반환
RETURN next_id;
END $$