web-dev-qa-db-ja.com

既存のタイプを「bigint」から「bigserial」に変更するにはどうすればよいですか?

次の構造のPostgreSQLテーブルがあります。

enter image description here

_prove_identity_id_のTYPEbigintからbigserialに変更するだけです。 docs を読みましたが、次のエラーなしで変更を合法的に達成する方法を理解できませんでした:_PostgreSQL said: type "bigserial" does not exist_

PostgreSQL 10.1 on x86_64-Apple-darwin14.5.0, compiled by Apple LLVM version 7.0.0 (clang-700.1.76), 64-bit

3
Dave Chambers

bigserial isnotタイプ。これは疑似タイプであり、表記法で内部的にbigintに解決され、さらにシーケンス、列のデフォルト、依存関係、および所有権が解決されます。

既存の行を持つ既存のbigint列をbigserialに変換する基本的なコマンド:

_CREATE SEQUENCE tbl_tbl_id_seq;
ALTER TABLE tbl ALTER COLUMN tbl_id SET DEFAULT nextval('tbl_tbl_id_seq');
ALTER SEQUENCE tbl_tbl_id_seq OWNED BY tbl.tbl_id;
SELECT setval('tbl_tbl_id_seq', COALESCE(max(tbl_id), 0)) FROM tbl;
_

setval()は、現在最も高いIDと同期してSEQUENCEを取得します。 「tbl」をテーブル名(_prove_identity_)に置き換えます。

ただし、追加した画像(プレーンテキストである必要があります)を拡大すると、既に適切なbigserial列である可能性があります。これはすべて誤解かもしれません。

詳細:

関連:

Postgres 10以降では、代わりにIDENTITY列を検討してください:

11

PostgreSQL 10を使用している場合は、 IDENTITY PROPERTY bigint列で、serialまたはbigserialマクロをまったく使用しない-理解が難しいのはPg固有の構文であり、権限が変更された場合:簡単めちゃくちゃにする。

ALTER TABLE provide_identity
  ALTER COLUMN prove_identity_id
  ADD GENERATED BY DEFAULT
  AS IDENTITY;

しかし、それを直接いじるのではなく、データベースをバックアップして、このスクリプトを 第2象限ブログ から実行することをお勧めします。このように実行します

SELECT upgrade_serial_to_identity('public.prove_identity', 'prove_identity_id');
3
Evan Carroll