2016-05-25 12 views
1

を存在しないシーケンス値を追加するためにはPostgresを頼む:私は、たとえば、既存のPostgresのテーブルを持って

CREATE TABLE profiles(
    profile_id SERIAL PRIMARY KEY, 
    num_feed  integer, 
    num_email  integer, 
    name   text 
); 

ALTER TABLE ONLY profiles ALTER COLUMN profile_id SET DEFAULT nextval('profiles_profile_id_seq'::regclass); 
ALTER TABLE ONLY profiles ADD CONSTRAINT profiles_pkey PRIMARY KEY (profile_id); 
CREATE INDEX "pi.profile_id" ON profiles USING btree (profile_id); 

そして、これは私が変更することはできません既存のデータである、私は新しいを追加することができますもの。

INSERT INTO profiles VALUES 
(3, 2, 5, 'Adam Smith'), 
(26, 2, 1, 'Fran Morrow'), 
(30, 2, 2, 'John Doe'), 
(32, 4, 1, 'Jerry Maguire'), 
(36, 1, 1, 'Donald Logue'); 

問題は、私は新しいデータを挿入しようとしたとき、Postgresはコラム「PROFILE_ID」に(良い)最小値が追加されますが、それは存在しない値に当たったとき/エラー失敗しますが、その値理由存在する。

ERROR: duplicate key value violates unique constraint "profile_id" 
DETAIL: Key (profile_id)=(3) already exists. 

次の存在しない値を追加することはできますか?

答えて

1

挿入文にSERIALフィールドを指定しないと、postgresはそれをシーケンスから生成させます。

INSERT INTO profiles 
(num_feed, num_email, name) 
VALUES 
(2, 5, 'Adam Smith'), 
(2, 1, 'Fran Morrow'), 
(2, 2, 'John Doe'), 
(4, 1, 'Jerry Maguire'), 
(1, 1, 'Donald Logue'); 

注:しばらく後にあなたが順序をリセットした場合、これは失敗すること、

ALTER SEQUENCE 'profiles_profile_id_seq' RESTART WITH 1; 

次のインサートのようなものは、再び1を作成し、失敗しようとします。

+0

私の場合、既存のprofile_idを変更できない場合はどうなりますか?私ができることは別のものを加えることです。最初から非常に明確でない場合は申し訳ありません。私はすでに私の質問を編集します。 – SianiparD

+0

どの行でエラーが表示されますか?あなたはテーブルを作成した直後に挿入しますか?それともずっと後で?私が説明したように、あなたは 'ALTER SEQUENCE'を使って次の番号を'> max(current_id) 'にすることができます。 –

+0

[CURVAL()](http://dba.stackexchange.com/questions/3281/how-do -i-use-currval-in-postgresql-to-last-inserted-id)を使用して、現在のseq値が何であるかを知ることができます。しかし、あなたはまた、挿入 –

関連する問題