回答:
(更新-コメントした人々に感謝)
という名前のテーブルがありtest1
、それに自動インクリメントの主キーid
(サロゲート)列を追加するとします。最近のバージョンのPostgreSQLでは、次のコマンドで十分です。
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
PostgreSQLの古いバージョン(8.xより前?)では、すべての厄介な作業を行わなければなりませんでした。次の一連のコマンドでうまくいくはずです。
ALTER TABLE test1 ADD COLUMN id INTEGER;
CREATE SEQUENCE test_id_seq OWNED BY test1.id;
ALTER TABLE test ALTER COLUMN id SET DEFAULT nextval('test_id_seq');
UPDATE test1 SET id = nextval('test_id_seq');
繰り返しますが、Postgresの最近のバージョンでは、これは上記の単一のコマンドとほぼ同じです。
ADD PRIMARY KEY
また、作成しNOT NULL
た制約は期待して欲しかったとして(postgresの9.3でテスト)。
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
これはあなたがする必要があるすべてです:
id
列を追加するこの回答をコメントで提供した@resnyanskiyにクレジットが付与されます。
ALTER TABLE <table> DROP CONSTRAINT <pkey_name>;
v10でID列を使用するには、
ALTER TABLE test
ADD COLUMN id { int | bigint | smallint}
GENERATED { BY DEFAULT | ALWAYS } AS IDENTITY PRIMARY KEY;
ID列の説明については、https://blog.2ndquadrant.com/postgresql-10-identity-columns/を参照してください。
GENERATED BY DEFAULTとGENERATED ALWAYSの違いについては、https: //www.cybertec-postgresql.com/en/sequences-gains-and-pitfalls/を参照してください。
シーケンスの変更については、https://popsql.io/learn-sql/postgresql/how-to-alter-sequence-in-postgresql/を参照してください。
SQL Error [23502]: ERROR: column "id" contains null values
私もそのようなものを探していたので、ここに着陸しました。私の場合、多くの列を持つステージングテーブルのセットから1つのテーブルにデータをコピーすると同時に、ターゲットテーブルに行IDを割り当てていました。ここに私が使用した上記のアプローチの変形があります。ターゲットテーブルの最後にシリアル列を追加しました。そうすれば、Insertステートメントにプレースホルダーを配置する必要がなくなります。次に、ターゲットテーブルへの単純な選択*により、この列に自動入力されます。以下は、PostgreSQL 9.6.4で使用した2つのSQLステートメントです。
ALTER TABLE target ADD COLUMN some_column SERIAL;
INSERT INTO target SELECT * from source;