PostgreSQLで主キーの自動インクリメントを設定する方法は?

PostgreSQLに22のカラムを持つテーブルがあり、自動インクリメントの主キーを追加したいのですが、どうすればよいですか?

BIGSERIAL 型の id というカラムを作成しようとしましたが、pgadmin はエラーで応答しました。

ERROR: sequence must have same owner as table it is linked to.

この問題を解決する方法をご存知の方はいらっしゃいますか? PostgreSQLでテーブルを再作成せずに自動インクリメントの主キーを作成するにはどうすればよいですか?

ソリューション

このコマンドを試してみてください。

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

テーブルを*作成したユーザーと同じDB-userで試してみてください。

解説 (11)

postgresql で主キーを自動インクリメントする。

ステップ1, テーブルの作成:.

CREATE TABLE epictable
(
    mytable_key    serial primary key,
    moobars        VARCHAR(40) not null,
    foobars        DATE
);

**最初のパラメータリストでmytable_keyが指定されていないことに注意してください、これはデフォルトのシーケンスがオートインクリメントになる原因です。

insert into epictable(moobars,foobars) values('delicious moobars','2012-05-01')
insert into epictable(moobars,foobars) values('worldwide interblag','2012-05-02')

*ステップ3、テーブルからを選択します:**。

el@voyager$ psql -U pgadmin -d kurz_prod -c "select * from epictable"

ステップ4、出力を解釈する:

mytable_key  |        moobars        |  foobars   
-------------+-----------------------+------------
           1 | delicious moobars     | 2012-05-01
           2 | world wide interblags | 2012-05-02
(2 rows)

mytable_keyカラムが自動インクリメントされていることを確認してください。

プロヒント:

postgresql は挿入、削除、更新、選択の速度を上げるために内部的にハッシュテーブル構造を使用するため、テーブルには常に主キーを使用すべきです。 もし主キーカラム(強制的にユニークで非NULL)が利用可能であれば、ハッシュ関数にユニークな種を提供するために依存することができる。 主キーカラムがない場合、ハッシュ関数は他のカラムをキーとして選択するため、非効率になる。

解説 (3)

カスタムシーケンスを使用して、Postgresqlで自動インクリメントの主キーを作成します:

ステップ1、シーケンスを作成する:

create sequence splog_adfarm_seq
    start 1
    increment 1
    NO MAXVALUE
    CACHE 1;
ALTER TABLE fact_stock_data_detail_seq
OWNER TO pgadmin;

ステップ2、テーブルを作成する

CREATE TABLE splog_adfarm
(
    splog_key    INT unique not null,
    splog_value  VARCHAR(100) not null
);

ステップ3、テーブルへの挿入

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'), 
    'Is your family tree a directed acyclic graph?'
);

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'), 
    'Will the smart cookies catch the crumb?  Find out now!'
);

ステップ4、行を観察する

el@defiant ~ $ psql -U pgadmin -d kurz_prod -c "select * from splog_adfarm"

splog_key |                            splog_value                             
----------+--------------------------------------------------------------------
        1 | Is your family tree a directed acyclic graph?
        2 | Will the smart cookies catch the crumb?  Find out now!
(3 rows)

この2つの行は、シーケンスで定義されたように、1から始まり1ずつ増加するキーを持つ。

ボーナスエリートProTip:

プログラマはタイピングが嫌いなので、nextval('splog_adfarm_seq')を打ち出すのは煩わしいです。 代わりにそのパラメータに DEFAULT と入力することができます、このように。

insert into splog_adfarm values (
    DEFAULT, 
    'Sufficient intelligence to outwit a thimble.'
);

上記を動作させるには、splog_adfarm テーブルの key カラムにデフォルト値を定義する必要があります。 どちらがきれいでしょう。

解説 (2)

これをpgadminで実行したい場合は、はるかに簡単です。 postgressqlでは、列に自動増分を追加するには、最初に自動増分シーケンスを作成して、必要な列に追加する必要があります。 私はこれが好きでした。

1)まず、テーブルの主要なキーがあることを確認する必要があります。 また、主キーのデータ型をbigintまたはsmallintに保持します。 (私はbigintを使用しましたが、他の回答で述べたようにシリアルと呼ばれるデータ型を見つけることができませんでした)。

2)次に、sequence->を右クリックしてシーケンスを追加します。 新しいシーケンスを追加。 テーブルにデータがない場合は、シーケンスをそのままにして、変更を行わないでください。 保存してください。 既存のデータがある場合は、以下に示すように、主キー列の最後または最も高い値を[定義]タブの[現在の値]に追加します。 。![ここに画像の説明を入力してください](http://i.stack.imgur.com/JH8tQ.png。)

3)最後に、以下に示すように、プライマリキーのデフォルト値に「nextval( 'your_sequence_name' :: regclass)」行を追加します。

。![ここに画像の説明を入力してください](http://i.stack.imgur.com/tTZjd.png。)。 ここでシーケンス名が正しいことを確認してください。 これがすべてであり、自動増分は機能するはずです。

解説 (0)

数値をシーケンスで使用する場合は、次のような新しいシーケンスを定義します。

CREATE SEQUENCE public.your_sequence
    INCREMENT 1
    START 1
    MINVALUE 1
;

次に、テーブルを変更して、id :のシーケンスを使用します。

ALTER TABLE ONLY table ALTER COLUMN id SET DEFAULT nextval('your_sequence'::regclass);
解説 (2)

多分私はこの質問に答えるのに少し遅れますが、私は私の仕事でこの問題に取り組んでいます:)。

列「a_code」= c1、c2、c3、c4を書きたかった。..

まず、「ref_id」という名前と「serial」というタイプの列を開きました。 次に、このコマンドの問題を解決しました。

update myschema.mytable set a_code=cast('c'||"ref_id" as text) 
解説 (1)

PostgreSQLの主キーを正常に自動インクリメントするために、次のスクリプトを試しました。

CREATE SEQUENCE dummy_id_seq
    START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

CREATE table dummyTable (
    id bigint DEFAULT nextval('dummy_id_seq'::regclass) NOT NULL,
    name character varying(50)
);
解説 (0)