0

新しい列を追加せずに、既存の列をシリアル自動生成キーにするためにテーブルを変更することはできますか?申し訳ありませんが、この質問がPostgreSQLの初心者向けですが、私はもっとSQL Serverの方ですが、PostgreSQLに移行しています。PostgresSqlテーブルに、テーブルに値が設定された後に自動生成されたキーを持つように変更できますか?

ナッツシェルでは、プログラムは既存のSQL ServerデータベースをPostgreSQLにコピーします。 SQL ServerのソースとしてPostgreSQLにミラーリングされたDBを欲しいだけで、必要に応じてテーブルやカラムを選択/除外したり、すべてを行うことができます。

プロセスがすべての値をコピーすると、コピーが完了したら、SQL Serverで行うようにキーを作成できるはずだと考えました。 PostgreSQLには、SQL ServerのSET INSERT_IDENTITY [ON|OFF]と同等のメソッドがあるので、自動生成されたキーを目的の値で上書きすることができます。 PostgreSQLで同等のものが見つからないだから私の後退はキーなしでPostgresで鏡像記録を作成し、テーブルを変更することです。しかし、それは望みどおりにテーブルを修正しているようですが、新しい列を作成していますが、PK/FK関係のためにこのブレークをやって頭痛を修正してしまいます。

提案がありますか?前もって感謝します。

答えて

0

PostgreSQLでは、明示的な値を挿入すると、自動生成キーは常にに上書きされます。値を指定しない場合(列を省略する場合)、またはキーワードDEFAULTを指定すると、生成されたキーが使用されます。

テーブルを考えると

CREATE TABLE t1 (id serial primary key, dat text); 

その後、これらの両方の意志シーケンスt1_id_seqから生成されたキーを取得:あなたが担当している

INSERT INTO t1 (id, dat) VALUES (42, 'joe'); 

:これは、代わりに独自の価値を提供します

INSERT INTO t1 (dat) VALUES ('fred'); 
INSERT INTO t1 (id, dat) VALUES (DEFAULT, 'bob'); 

を提供された値が既存のデータと競合しないようにするため、アイデンティティ・シーケンスが生成する将来の値を使用します。 PostgreSQLはではなく、42の行を手作業で挿入し、それ自身のシーケンスカウンタがそのポイントに達するとスキップすることに注意してください。

通常は、指定された値でロードし、シーケンスをテーブル内のすべてのキーの最大値にリセットするので、そこから新しいローカル挿入が数えられます。

関連する問題