PostgreSQLに22のカラムを持つテーブルがあり、自動インクリメントの主キーを追加したいのですが、どうすればよいですか?
BIGSERIAL 型の id
というカラムを作成しようとしましたが、pgadmin はエラーで応答しました。
ERROR: sequence must have same owner as table it is linked to.
この問題を解決する方法をご存知の方はいらっしゃいますか? 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)が利用可能であれば、ハッシュ関数にユニークな種を提供するために依存することができる。 主キーカラムがない場合、ハッシュ関数は他のカラムをキーとして選択するため、非効率になる。
カスタムシーケンスを使用して、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 カラムにデフォルト値を定義する必要があります。 どちらがきれいでしょう。
これをpgadminで実行したい場合は、はるかに簡単です。 postgressqlでは、列に自動増分を追加するには、最初に自動増分シーケンスを作成して、必要な列に追加する必要があります。 私はこれが好きでした。
1)まず、テーブルの主要なキーがあることを確認する必要があります。 また、主キーのデータ型をbigintまたはsmallintに保持します。 (私はbigintを使用しましたが、他の回答で述べたようにシリアルと呼ばれるデータ型を見つけることができませんでした)。
2)次に、sequence->を右クリックしてシーケンスを追加します。 新しいシーケンスを追加。 テーブルにデータがない場合は、シーケンスをそのままにして、変更を行わないでください。 保存してください。 既存のデータがある場合は、以下に示すように、主キー列の最後または最も高い値を[定義]タブの[現在の値]に追加します。 。。
3)最後に、以下に示すように、プライマリキーのデフォルト値に「nextval( 'your_sequence_name' :: regclass)」行を追加します。
。。 ここでシーケンス名が正しいことを確認してください。 これがすべてであり、自動増分は機能するはずです。
数値をシーケンスで使用する場合は、次のような新しいシーケンスを定義します。
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);
多分私はこの質問に答えるのに少し遅れますが、私は私の仕事でこの問題に取り組んでいます:)。
列「a_code」= c1、c2、c3、c4を書きたかった。..
まず、「ref_id」という名前と「serial」というタイプの列を開きました。 次に、このコマンドの問題を解決しました。
update myschema.mytable set a_code=cast('c'||"ref_id" as text)
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)
);