web-dev-qa-db-ja.com

PostgreSQLで自動インクリメントの主キーを設定するにはどうすればいいですか?

PostgreSQLに22列のテーブルがあり、自動インクリメントの主キーを追加したい。

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

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

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

245
mkn

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

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

created テーブルを持っているのと同じDBユーザーで試してみてください。

269
A.H.

Postgresqlの主キーの自動インクリメント:

ステップ1、テーブルを作成します。

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

ステップ2、このようにテーブルに値を挿入します。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列が自動インクリメントされたことを確認してください。

ProTip:

Postgresqlはハッシュテーブル構造を内部的に使用して挿入、削除、更新および選択の速度を上げるので、常にテーブルで主キーを使用する必要があります。主キーカラム(強制的に一意でnull以外)が利用可能な場合は、ハッシュ関数の一意のシードを提供するためにそれを信頼することができます。使用可能な主キー列がない場合は、他の列のセットをキーとして選択するため、ハッシュ関数は非効率的になります。

243
Eric Leschinski

カスタムシーケンスを使用して、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テーブルのそのキー列にデフォルト値を定義する必要があります。どちらがきれいです。

33
Eric Leschinski

Pgadminでこれを行いたい場合は、はるかに簡単です。 postgressqlでは、列に自動インクリメントを追加するには、まず自動インクリメントシーケンスを作成してそれを必要な列に追加する必要があります。私はこんな感じでした。

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

2)次にsequence-> を右クリックしてシーケンスを追加します - 新しいシーケンスを追加します 。テーブルにデータがない場合は、シーケンスをそのままにして、何も変更しないでください。保存するだけです。既存のデータがある場合は、以下に示すように、主キー列の最後または最大の値を[定義]タブの[現在値]に追加します。 enter image description here

3)最後に、以下に示すように、主キーのDefault値にnextval('your_sequence_name'::regclass)という行を追加します。

enter image description here ここでシーケンス名が正しいことを確認してください。これがすべてであり、自動インクリメントは機能するはずです。

16
toing_toing

シーケンスで数字を使いたい場合は、次のように新しいシーケンスを定義してください。

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
acaruci

私は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
Asad Shakeel

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

列 'a_code' = c1、c2、c3、c4を書きたいのですが。

最初に、名前がref_idでタイプがserialの列を開きました。それから私はこのコマンドで私の問題を解決しました:

update myschema.mytable set a_code=cast('c'||"ref_id" as text) 
0
user5838061