PostgreSQL シリアルキーの初期化

 いつも忘れるので個人的メモ。

 pgAdminにおいてデータベース→スキーマ→public→テーブル→test_tableを選択し、右のペインにある依存関係を見ると、テーブルにSERIAL型でPRIMALY KEYに設定されている物がある場合、データ型Sequenceとして変数名が存在している。この変数名は「テーブル名_列名_seq」というパターンで自動的に決められるようだ。
 この変数に対し、

  select setval('mytable_id_seq', 1, false);

などというSQL文を実行すれば初期化出来る。なぜSQLのレコードにシリアルキーなんぞが必要なのか?ということだが、レコードを一定数ずつ取り出したいとき、連番が付与されているとやりやすいから。他にも方法があるかもしれないが、この情報になかなか辿りつけないのであまりないのかもしれない。そもそもリレーショナルデータベース自体が、デフォルトで連番ベースでの参照を意図して設計されていないのかもしれない。つまりそれらも含めてデータ構造は自分で決めてねということ・・・か?
 
 ちなみに、SERIAL型で設定された列の値は、レコードが追加されるごとに単調増加するが、truncate table mytable; などとしてレコードをtruncateしても、1スタートに戻らず、テーブルがtruncateされる直前のシリアルキーの次の値からまたはじまるので注意。なので上のようにsetvalして初期化する。他にも方法があるかもしれない。