2016-05-25 14 views
1

Ich habe eine bestehende Postgres-Tabelle, zum Beispiel eines nicht existierenden Sequenzwert hinzuzufügen:Postgres Vorstellung

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); 

Und dies wird die vorhandenen Daten, die ich nicht, kann ich ändern kann einen neue nur hinzufügen Einsen.

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'); 

Das Problem ist, wenn ich eine neue Daten einzufügen versucht, Postgres einen Mindestwert wird auf Spalte „profile_id“ (was gut ist) wird jedoch/Fehler schlug fehl, wenn es einen vorhandenen Wert trifft, weil dieser Wert existiert.

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

Ist es möglich, Postgres zu bitten, einen nächsten nicht vorhandenen Wert hinzuzufügen?

Antwort

1

Geben Sie das Feld SERIAL nicht im Einfügesatz an, lassen Sie es von postgres aus der Sequenz für Sie generieren.

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'); 

HINWEIS: Dies kann fehlschlagen, wenn man nach einer Weile der Sequenz zurückgesetzt, so etwas wie

ALTER SEQUENCE 'profiles_profile_id_seq' RESTART WITH 1; 

nächster Einsatz wird versuchen 1 wieder zu erstellen und scheitern.

+0

Für meinen Fall, was ist, wenn ich die vorhandene profile_id nicht ändern kann. Was ich tun kann ist, ein anderes hinzuzufügen. Tut mir leid, wenn es von Anfang an nicht sehr klar ist. Ich bearbeite schon meine Frage. – SianiparD

+0

Welche Zeile gibt Ihnen einen Fehler? Ist diese Einfügung nach dem Erstellen der Tabelle angezeigt? oder viel später? Wie ich erkläre, können Sie 'ALTER SEQUENCE' verwenden, so dass die nächste Zahl'> max (current_id) ' –

+0

ist. Sie können auch [CURVAL()] (http://dba.stackexchange.com/questions/3281/how-do) ausprobieren -i-verwenden-currval-in-postgresql-zu-erhalten-die-letzte-eingefügt-id) zu wissen, was ist der aktuelle Seq-Wert. Aber Sie müssen auch das serielle Feld aus einfügen –