기존 테이블에 배열 열 추가
이 단계에서는 PostgreSQL 에서 배열 열을 추가하고 조작하는 방법을 배웁니다. 기존 products 테이블을 확장하여 태그를 저장할 배열 열을 추가하겠습니다. 배열 열을 사용하면 단일 열에 동일한 데이터 유형의 여러 값을 저장할 수 있으며, 이는 태그, 카테고리 또는 기능과 같은 항목 목록을 저장하는 데 유용합니다.
이전 단계에서 이미 데이터베이스에 연결되어 있고 products 테이블이 있으므로 기존 테이블에 배열 열을 추가해 보겠습니다.
ALTER TABLE products ADD COLUMN name VARCHAR(255);
ALTER TABLE products ADD COLUMN tags TEXT[];
이 명령은 기존 products 테이블에 name(문자열) 과 tags(문자열 배열) 라는 두 개의 새 열을 추가합니다. TEXT[] 데이터 유형은 tags 열이 텍스트 값의 배열임을 지정합니다.
각 alter 명령에 대해 다음과 유사한 출력이 표시되어야 합니다.
ALTER TABLE
이제 기존 데이터를 업데이트하고 새 열로 새 데이터를 삽입해 보겠습니다.
UPDATE products SET name = data ->> 'name' WHERE id = 1;
UPDATE products SET name = data ->> 'name' WHERE id = 2;
UPDATE products SET tags = ARRAY['electronics', 'computers', 'portable'] WHERE id = 1;
UPDATE products SET tags = ARRAY['electronics', 'accessories', 'input'] WHERE id = 2;
이 명령은 JSONB 데이터에서 추출한 이름 및 태그 정보와 새 배열 값을 사용하여 기존 제품을 업데이트합니다.
각 업데이트에 대해 다음과 유사한 출력이 표시되어야 합니다.
UPDATE 1
배열 데이터를 쿼리하려면 배열 인덱싱을 사용할 수 있습니다. PostgreSQL 의 배열 인덱스는 1 부터 시작합니다.
예를 들어, 첫 번째 제품의 첫 번째 태그를 검색하려면 다음 쿼리를 사용할 수 있습니다.
SELECT tags[1] FROM products WHERE id = 1;
이 명령은 id가 1 인 products 테이블의 tags 배열에서 인덱스 1 의 요소를 선택합니다.
다음과 유사한 출력이 표시되어야 합니다.
tags
-----------
electronics
(1 row)
UNNEST 함수를 사용하여 배열을 행 집합으로 확장할 수도 있습니다.
예를 들어, 모든 제품의 모든 태그를 검색하려면 다음 쿼리를 사용할 수 있습니다.
SELECT name, UNNEST(tags) AS tag FROM products;
이 명령은 tags 배열에서 name과 각 개별 tag를 선택하여 각 태그에 대해 새 행을 생성합니다.
다음과 유사한 출력이 표시되어야 합니다.
name | tag
---------+-------------
Laptop | electronics
Laptop | computers
Laptop | portable
Keyboard| electronics
Keyboard| accessories
Keyboard| input
(6 rows)
@> 연산자를 사용하여 배열에 특정 값이 포함되어 있는지 확인할 수 있습니다.
예를 들어, 'electronics' 태그가 있는 모든 제품을 찾으려면 다음 쿼리를 사용할 수 있습니다.
SELECT name FROM products WHERE tags @> ARRAY['electronics'];
이 명령은 products 테이블에서 tags 배열에 'electronics' 값이 포함된 모든 행의 이름을 선택합니다.
다음과 유사한 출력이 표시되어야 합니다.
name
----------
Laptop
Keyboard
(2 rows)
&& 연산자를 사용하여 두 배열에 공통 요소가 있는지 확인할 수도 있습니다.
예를 들어, 첫 번째 제품과 태그를 공유하는 모든 제품을 찾으려면 다음 쿼리를 사용할 수 있습니다.
SELECT p2.name FROM products p1, products p2 WHERE p1.id = 1 AND p1.tags && p2.tags AND p2.id != 1;
이 명령은 첫 번째 제품 (별칭 p1) 의 태그와 하나 이상의 태그를 공유하는 products 테이블 (별칭 p2) 의 모든 행 이름을 선택하며, 첫 번째 제품 자체는 제외합니다.
다음과 유사한 출력이 표시되어야 합니다.
name
----------
Keyboard
(1 row)
완벽합니다! 기존 테이블에 배열 열을 성공적으로 추가하고 배열을 다루는 방법을 배웠습니다. 이제 products 테이블에는 JSONB 및 배열 데이터 유형이 모두 포함되어 다음 단계를 진행할 준비가 되었습니다.