次の構造のPostgreSQLテーブルがあります。
_prove_identity_id
_のTYPE
をbigint
から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
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
列を検討してください:
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');