ALTER SEQUENCE
ALTER SEQUENCE
ALTER SEQUENCE는 시퀀스 생성기(sequence generator)의 정의를 바꾸는 명령이에요. 데이터 타입, 증분, 최소·최대값, 순환 여부, 시작·재시작 값, 캐시, 소유 테이블 등을 변경할 수 있어요.
출처: PostgreSQL 문서
본문
문법 (Synopsis)
ALTER SEQUENCE [ IF EXISTS ] name
[ AS data_type ]
[ INCREMENT [ BY ] increment ]
[ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
[ [ NO ] CYCLE ]
[ START [ WITH ] start ]
[ RESTART [ [ WITH ] restart ] ]
[ CACHE cache ]
[ OWNED BY { table_name.column_name | NONE } ]
ALTER SEQUENCE [ IF EXISTS ] name SET { LOGGED | UNLOGGED }
ALTER SEQUENCE [ IF EXISTS ] name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER SEQUENCE [ IF EXISTS ] name RENAME TO new_name
ALTER SEQUENCE [ IF EXISTS ] name SET SCHEMA new_schema
설명 (Description)
ALTER SEQUENCE는 기존 시퀀스 생성기의 파라미터를 변경해요. ALTER SEQUENCE 명령에서 명시적으로 설정되지 않은 파라미터는 이전 설정을 그대로 유지해요.
이 명령을 쓰려면 시퀀스의 소유자여야 해요. 시퀀스의 스키마를 바꾸려면 새 스키마에 대한 CREATE 권한도 있어야 해요. 소유자를 바꾸려면 새 소유 역할로 SET ROLE 할 수 있어야 하고, 그 역할이 시퀀스의 스키마에 대한 CREATE 권한도 가져야 해요. (이런 제약은 소유자 변경을 통해 시퀀스를 드롭하고 재생성하는 것 이상의 일을 못 하게 하려는 거예요. 다만 슈퍼유저는 어떤 시퀀스의 소유권이든 바꿀 수 있어요.)
파라미터 (Parameters)
name — 변경할 시퀀스의 이름이에요 (스키마 한정을 써도 돼요).
IF EXISTS — 시퀀스가 존재하지 않아도 오류를 내지 않아요. 이 경우 통지(notice)가 발행돼요.
data_type — 선택적 AS data_type 절은 시퀀스의 데이터 타입을 변경해요. 유효한 타입은 smallint, integer, bigint예요.
이전 최소·최대값이 옛 데이터 타입의 최소·최대값이었던 경우에만 (즉 시퀀스가 암시적이든 명시적이든 NO MINVALUE나 NO MAXVALUE로 생성된 경우) 데이터 타입 변경 시 시퀀스의 최소·최대값이 자동으로 바뀌어요. 그렇지 않으면, 같은 명령에서 새 값이 주어지지 않는 한 최소·최대값은 유지돼요. 최소·최대값이 새 데이터 타입에 맞지 않으면 오류가 발생해요.
increment — INCREMENT BY increment 절은 선택이에요. 양수 값은 오름차순 시퀀스를, 음수 값은 내림차순 시퀀스를 만들어요. 지정하지 않으면 기존 증분 값이 유지돼요.
minvalue / NO MINVALUE — 선택적 MINVALUE minvalue 절은 시퀀스가 생성할 수 있는 최소값을 결정해요. NO MINVALUE를 지정하면 오름차순·내림차순 시퀀스에 대해 각각 기본값 1과 데이터 타입의 최소값이 사용돼요. 두 옵션 모두 지정하지 않으면 현재 최소값이 유지돼요.
maxvalue / NO MAXVALUE — 선택적 MAXVALUE maxvalue 절은 시퀀스의 최대값을 결정해요. NO MAXVALUE를 지정하면 오름차순·내림차순 시퀀스에 대해 각각 데이터 타입의 최대값과 -1이 사용돼요. 두 옵션 모두 지정하지 않으면 현재 최대값이 유지돼요.
CYCLE — 선택적 CYCLE 키워드는 오름차순·내림차순 시퀀스가 각각 maxvalue나 minvalue에 도달했을 때 값이 되돌아(wrap around) 순환하도록 할 수 있어요. 한계에 도달하면 다음에 생성되는 숫자는 각각 minvalue 또는 maxvalue가 돼요.
NO CYCLE — 선택적 NO CYCLE 키워드를 지정하면 시퀀스가 최대값에 도달한 이후의 nextval 호출은 오류를 반환해요. CYCLE과 NO CYCLE 모두 지정하지 않으면 기존 순환 동작이 유지돼요.
start — 선택적 START WITH start 절은 시퀀스의 기록된 시작값을 변경해요. 이것은 현재 시퀀스 값에는 영향을 주지 않고, 향후 ALTER SEQUENCE RESTART 명령이 사용할 값만 설정해요.
restart — 선택적 RESTART [ WITH restart ] 절은 시퀀스의 현재 값을 변경해요. 이것은 is_called = false로 setval 함수를 호출하는 것과 비슷해요. 지정된 값이 다음 nextval 호출에서 반환돼요. 재시작 값 없이 RESTART라고 쓰는 것은 CREATE SEQUENCE로 기록되었거나 마지막에 ALTER SEQUENCE START WITH로 설정된 시작값을 제공하는 것과 같아요.
setval 호출과 달리, 시퀀스에 대한 RESTART 연산은 트랜잭션적이며 같은 시퀀스에서 숫자를 얻으려는 동시 트랜잭션을 막아요. 그런 동작 방식이 원하는 게 아니라면 setval을 사용해야 해요.
cache — CACHE cache 절은 시퀀스 번호를 미리 할당해 메모리에 저장해 더 빠르게 접근할 수 있게 해요. 최소값은 1이에요 (한 번에 하나의 값만 생성됨, 즉 캐시 없음). 지정하지 않으면 기존 캐시 값이 유지돼요.
SET { LOGGED | UNLOGGED } — 이 형태는 시퀀스를 unlogged에서 logged로 또는 그 반대로 변경해요 (CREATE SEQUENCE 참고). 임시 시퀀스에는 적용할 수 없어요.
OWNED BY table_name.column_name / OWNED BY NONE — OWNED BY 옵션은 시퀀스를 특정 테이블 컬럼과 연결해서, 그 컬럼(또는 전체 테이블)이 드롭되면 시퀀스도 자동으로 드롭되게 해요. 지정하면 시퀀스에 대한 기존 연결을 교체해요. 지정된 테이블은 시퀀스와 같은 소유자이고 같은 스키마에 있어야 해요. OWNED BY NONE을 지정하면 기존 연결을 제거해 시퀀스를 "독립(stand-alone)" 상태로 만들어요.
new_owner — 시퀀스의 새 소유자 사용자 이름이에요.
new_name — 시퀀스의 새 이름이에요.
new_schema — 시퀀스의 새 스키마예요.
주의 (Notes)
ALTER SEQUENCE는 현재 백엔드 외에, 시퀀스 값을 미리 할당(캐시)해 둔 다른 백엔드의 nextval 결과에는 즉시 영향을 주지 않아요. 그 백엔드들은 변경된 시퀀스 생성 파라미터를 알아차리기 전에 캐시된 값을 모두 소진해요. 현재 백엔드는 즉시 영향을 받아요.
ALTER SEQUENCE는 시퀀스의 currval 상태에는 영향을 주지 않아요. (PostgreSQL 8.3 이전에는 때때로 영향을 주었어요.)
ALTER SEQUENCE는 동시 nextval, currval, lastval, setval 호출을 차단해요.
역사적 이유로 ALTER TABLE도 시퀀스와 함께 사용할 수 있어요. 하지만 시퀀스에 허용되는 ALTER TABLE 변형은 위에 표시된 형태와 동등한 것뿐이에요.
예제 (Examples)
serial이라는 시퀀스를 105에서 재시작하려면:
ALTER SEQUENCE serial RESTART WITH 105;
호환성 (Compatibility)
ALTER SEQUENCE는 AS, START WITH, OWNED BY, OWNER TO, RENAME TO, SET SCHEMA 절이 PostgreSQL 확장이라는 점을 제외하면 SQL 표준을 따르지 않아요.
더 알아보기 (Learn more)
RESTART는 트랜잭션적이고 동시 트랜잭션을 차단하지만,setval()은 그렇지 않아요. 상황에 따라 골라 쓰세요.OWNED BY로 연결한 컬럼이 드롭되면 시퀀스도 자동으로 드롭돼요.ALTER SEQUENCE는 현재 백엔드 외의 캐시된nextval결과에는 즉시 반영되지 않아요.AS절 없이 데이터 타입을 바꾸면 기존 최소·최대값이 유지돼요.