채워진 테이블에서 다시 1부터 시작하도록 PostgreSQL 테이블의 기본 키를 재설정하는 방법이 있습니까?
지금은 1000000 이상에서 숫자를 생성하고 있습니다. 모든 기존 데이터를 그대로 유지하면서 모두 재설정하고 1로 시작하기를 원합니다.
답변:
https://stackoverflow.com/a/5272164/5190 에서 더 나은 옵션을 참조하십시오.
자동 증가하는 기본 키 (즉, 데이터 유형이있는 열 serial primary key
)는 시퀀스 와 연결됩니다 . setval(<seqname>, <next_value>)
함수를 사용하여 시퀀스의 다음 값을 설정할 수 있습니다 . 실제로 자체적으로 함수를 실행하려면 다음 SELECT
과 같이 를 사용해야 합니다.SELECT setval(<seqname>, <next_value>)
직렬을 사용할 때 자동 생성 된 시퀀스의 이름은 다음과 같습니다. <table>_<column>_seq
SELECT setval('table_id_seq', 1)
하면 새 레코드를 삽입 할 때 ID는 1 대신 값 2를 사용 합니다. Paweł Gościcki의 솔루션이 작동합니다. (PostgreSQL 9.3)
시퀀스를 재설정하여 번호 1로 다시 시작하는 가장 좋은 방법은 다음을 실행하는 것입니다.
ALTER SEQUENCE <tablename>_<id>_seq RESTART WITH 1
따라서 예를 들어 users
테이블의 경우 다음과 같습니다.
ALTER SEQUENCE users_id_seq RESTART WITH 1
WITH 1
매개 변수는 redundand이며 ommited 할 수 있습니다
seq
, can by pk
등 이 아닙니다 ) ... 그러나 on psql by \d my_table_name
. 또는, SQL에 의해 확인SELECT * FROM pg_indexes WHERE tablename like '%my_table_name%'
@bluish는 실제로 자동 증가 기본 키를 사용하여 새 레코드를 삽입하는 것은 다음과 같이 명시 적으로 시퀀스를 사용하는 것과 같습니다.
INSERT INTO MyTable (id, col1, ...) VALUES (MySeq.nextval(), val1, ...)
따라서 첫 번째 ID를 1로 설정하려면 시퀀스를 0으로 설정해야합니다.하지만 범위를 벗어 났으므로 ALTER SEQUECE 문을 사용해야합니다. 예를 들어 테이블 메뉴에 number라는 직렬 필드가있는 경우 :
ALTER SEQUENCE menu_number_seq RESTART
일을 완벽하게 만들 것입니다.
SELECT setval('table_id_seq', 10000)