늒네 기록

[postgresql] mysql의 auto increment 기능과 유사한 serial 본문

DB 공부 기록/postgresql

[postgresql] mysql의 auto increment 기능과 유사한 serial

jaeha lee 2020. 10. 3. 02:04

postgresql을 처음 써보면서 신기했던 건, mysql에서 봤던 auto increment 조건을 바로 붙여주는 옵션이 없는 대신 serial이라는 타입이 존재했던 것. 

 

https://www.postgresql.org/docs/current/datatype-numeric.html

 

PostgreSQL: Documentation: 13: 8.1. Numeric Types

Numeric types consist of two-, four-, and eight-byte integers, four- and eight-byte floating-point numbers, and selectable-precision decimals. Table 8.2 lists the available types. Table 8.2. Numeric Types Name Storage Size Description Range smallint 2 b

www.postgresql.org

위 페이지에 보면 numeric type으로 smallserial, serial, bigserial이 존재하는데, 'auto incrementing integer'라는 설명이 붙어있다. 그리고 ctrl+f로 serial을 찾아서 아래 있는 설명을 읽어보면 흥미로운 사실을 알 수 있는데,

1
2
3
CREATE TABLE tablename (
    colname SERIAL
);
cs

이 SQL문이,

1
2
3
4
5
CREATE SEQUENCE tablename_colname_seq AS integer;
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;
cs

이 SQL문과 같은 역할을 한다는 것이다. 여기서 눈여겨보아야 할 것은 SEQUENCE를 만들었다는 것인데, 이 말은 특정 유저에 테이블에 접근할 권한을 주었다고 해도 시퀀스에 접근할 권한을 주지 않으면 아래와 같은 오류가 발생할 수 있다는 것이다.

1
오류:  test_table_id_seq 시퀀스 접근 권한 없음
cs

테스트를 위해 만들었던 테이블 이름이 test_table이었고, serial 타입으로 만든 칼럼이 id라서 위의 예시 SQL문에서와 같이 test_table_id_seq라는 시퀀스가 생성되었으나, 시퀀스에 별도로 접근 권한을 설정해주지 않은 상태였어서 접근 권한 오류가 뜨고 테이블에 insert가 불가능했었다.

 

시퀀스 접근 권한 없음 오류가 갑자기 나와서 당황했었는데, 시퀀스에 들어가서 접근 권한을 새로 주었더니 문제가 해결되었다.

반응형
Comments