ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

serialを使っているテーブル名を変更するときの注意

スポンサードリンク

PostgreSQLこんなテーブルを作った

create table site_categories (
  id bigserial primary key,
  site_name varchar(200) unique,
  created timestamp,
  update timestamp
);

で、途中で名前を間違えていることに気づいた。サイトのカテゴリではなくて、サイト名を入れたかっただけだったから。

> alter table sites_categories rename to sites;

おk

んで、これでいけると思ったが。。。

このテーブルへの処理しようとすると応答が返ってこなくなった。

おかげさまでプロセスを切る方法を学んだ

$ psql -q -c'SELECT l.pid, db.datname, c.relname, l.locktype, l.mode FROM pg_locks l LEFT JOIN pg_class c ON l.relation=c.relfilenode LEFT JOIN pg_database db ON l.database = db.oid ORDER BY l.pid;' -d db_name

  pid  | datname | relname  |  locktype  |      mode
-------+---------+----------+------------+-----------------
 28376 | db_name  | pg_locks | relation   | AccessShareLock
 28376 |         |          | virtualxid | ExclusiveLock
 28376 |         |          | relation   | AccessShareLock
 28376 | db_name  |          | relation   | AccessShareLock
 28376 |         |          | relation   | AccessShareLock

$ psql -q -c 'select pg_cancel_backend(${process_id})' -d db_name

で、何度切っても直らない・・・・。何故だ

と、テーブル一覧を確認したらちょっとハッとなった

=> \d
                List of relations
 Schema |        Name        |   Type   |  Owner
--------+--------------------+----------+---------
 public | site_categories_id_seq        | sequence | pg-user
 public | sites              | table    | pg-user
(6 rows)

なるほど? xxx_seqというテーブル?の名前は変わっていないっぽい

調べたらテーブルではなくsequenceと呼ばれる何からしい。

mysqlのauto incrementのようなふるまいをするserial型を指定してテーブルを作成すると一緒に作成されるらしい。

なるほど、処理はよくわからんが、こいつの名前も変えてやらないといけないじゃないかなとおもったわけで変える。

=> alter sequence site_categories_id_seq rename to sites_id_seq

これで不具合がなおった!!

参考URL

https://www.postgresql.jp/document/7.3/user/ddl-alter.html