DB

[PostgreSQL] 기본 데이터 타입 정리 - User defined data

지과쌤 2020. 9. 1.
반응형

  • Character types / why should we use char instead of varchar?
  • Numeric types
  • Boolean types
  • Temporal types
  • UUID for storing Universally Unique Identifiers
  • Array for storing array strings, numbers, etc...
  • JSON stores JSON data
  • hstore stores key-value pair
  • User defined data

User-defined Data Types

 

create domain : 테이블을 만들때, 특정 타입에 대해 제약조건을 걸어주는것 (스키마 내부)

 

일반적으로 제약조건을 걸어줄 때의 쿼리

CREATE TABLE mailing_list (
    id SERIAL PRIMARY KEY,
    first_name VARCHAR NOT NULL,
    last_name VARCHAR NOT NULL,
    email VARCHAR NOT NULL,
    CHECK (
        first_name !~ '\s'
        AND last_name !~ '\s'
    )
);

 

create domain을 사용하여 varchar type으로 contact_name이라는 새 도메인을 생성.

CREATE DOMAIN contact_name AS 
   VARCHAR NOT NULL CHECK (value !~ '\s');

 

해당 도메인의 이름을 data type으로 사용한다.

CREATE TABLE mailing_list (
    id serial PRIMARY KEY,
    first_name contact_name,
    last_name contact_name,
    email VARCHAR NOT NULL
);

 

이후 쿼리문

INSERT INTO mailing_list (first_name, last_name, email)
VALUES('Jame V','Doe','jame.doe@example.com');

//결과
ERROR:  value for domain contact_name violates check constraint "contact_name_check"


INSERT INTO mailing_list (first_name, last_name, email)
VALUES('Jane','Doe','jane.doe@example.com');

//결과
정상입력

 

\dD 를 사용하면 모든 도메인을 볼 수 있다.

test=#\dD
                                     List of domains
 Schema |     Name     |       Type        | Modifier |               Check
--------+--------------+-------------------+----------+-----------------------------------
 public | contact_name | character varying | not null | CHECK (VALUE::text !~ '\s'::text)
(1 row)

 

 

create type : 특정 컬럼을 미리 정해 반환하는 함수를 만들 수 있다.

 

1.  film_summary 생성

CREATE TYPE film_summary AS (
    film_id INT,
    title VARCHAR,
    release_year SMALLINT
);

 

2. film_summary data type을 function의 return type으로 지정한다.

CREATE OR REPLACE FUNCTION get_film_summary (f_id INT) 
    RETURNS film_summary AS 
$$ 
SELECT
    film_id,
    title,
    release_year
FROM
    film
WHERE
    film_id = f_id ; 
$$ 
LANGUAGE SQL;

 

3. get_film_summary() function을 호출한다.

SELECT * FROM get_film_summary (40);

반응형

댓글

💲 추천 글