duplicate key
Maciej Misiak - 17-07-2007 00:00
duplicate key
Win XP, PostgreSQL 8.1. Krótko: próba insertu do tabeli bez podania primary key kończy się komunikatem "duplicate key violates unique constraint "operacja_pkey""
A teraz szczegóły. Tabela wygląda tak: CREATE TABLE operacja ( id serial NOT NULL, id_wyciagu int4, id_rodzaju_operacji int4, kwota numeric(10,2), opis varchar(255), data date, usunieto bool, CONSTRAINT operacja_pkey PRIMARY KEY (id), CONSTRAINT operacja_id_rodzaju_operacji_fkey FOREIGN KEY (id_rodzaju_operacji) REFERENCES rodzaj_operacji (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT operacja_id_wyciagu_fkey FOREIGN KEY (id_wyciagu) REFERENCES wyciag (id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION ) WITHOUT OIDS;
operacja insert tak: insert into operacja (id_rodzaju_operacji, kwota, opis) values (3, 123, 'abc');
Jeśli podam wprost odpowiednie czyli nieistniejące id: insert into operacja (id, id_rodzaju_operacji, kwota, opis) values (5555, 3, 123, 'abc');
to wszystko działa, ale nigdy wcześniej nie musiałem tego robić. Dla testu stworzyłem prostszą tabelę:
CREATE TABLE testowa ( id serial NOT NULL, skrot int4, nazwa varchar(20), CONSTRAINT testowa_pkey PRIMARY KEY (id) ) WITHOUT OIDS;
i, motyla noga, tutaj działa jak trzeba! insert into testowa (skrot, nazwa) values (5555, 'abc');
Doczytałem w helpie Postgresa, że id można definiować jako id integer NOT NULL DEFAULT nextval('serial'),
ale takich cudów też nigdy wcześniej nie musiałem wypisywać. Może ktoś wytłumaczyć o co chodzi?
-- grizzley
Cezio Statkiewicz - 17-07-2007 00:00
A znacie ten, jak Maciej Misiak *przyjeżdża furmanką i mówi:
> Win XP, PostgreSQL 8.1. > Krótko: próba insertu do tabeli bez podania primary key kończy się > komunikatem "duplicate key violates unique constraint "operacja_pkey""
*czyżbyś wcześniej wrzucał coś ręcznie w pole id? najprawdopodobniej rozjechałeś się z sekwencją, z której brane są wartości do id.
*sprawdź stan sekwencji:
*select last_value, min_value, max_value, cache_value, is_cycled, increment_by from operacja_id_seq;
i ustaw wartość sekwencj na nową wartość:
select setval('operacja_id_seq', 5556);
> Doczytałem w helpie Postgresa, że id można definiować jako > id integer NOT NULL DEFAULT nextval('serial'),
*jest to prawie tak samo jak serial, tylko w tym wypadku musisz ręcznie utworzyć sekwencję 'serial'. * *CS
-- Cezio Statkiewicz - http://thelirium.net rlu#280280 gg#5223219 jabber://koophel@jabber.wp.pl
Maciej Misiak - 17-07-2007 00:00
Cezio Statkiewicz pisze: > A znacie ten, jak Maciej Misiak przyjeżdża furmanką i mówi:
Mam nadzieję, że na to prawa jazdy nie trza, bo mnie zaraz ścigną...
>> Krótko: próba insertu do tabeli bez podania primary key kończy się >> komunikatem "duplicate key violates unique constraint "operacja_pkey"" > > czyżbyś wcześniej wrzucał coś ręcznie w pole id? najprawdopodobniej > rozjechałeś się z sekwencją, z której brane są wartości do id. > > sprawdź stan sekwencji: > > select last_value, min_value, max_value, cache_value, is_cycled, > increment_by from operacja_id_seq; > > i ustaw wartość sekwencj na nową wartość: > > select setval('operacja_id_seq', 5556);
Tak, wcześniej pomyłkowo raz wstawiłem rekord z ręcznym id. I last_value = 15, a rekordy są aż do 28 (plus ten desperacki 5555...). setval załatwiło sprawę. Dzięki.
-- grizzley
hubert depesz lubaczewski - 19-07-2007 00:06
On 2007-07-16, Maciej Misiak <grizzley@poczta.onet.pl> wrote:
na pytanie o duplicate key juz dostałeś odpowiedż, ale:
> Doczytałem w helpie Postgresa, że id można definiować jako > id integer NOT NULL DEFAULT nextval('serial'), > ale takich cudów też nigdy wcześniej nie musiałem wypisywać. Może ktoś > wytłumaczyć o co chodzi?
zrób \d tabelki która miała "id serial". i zobacz jak wygląda definicja pola id.
ogolnie - jest kilka sytuacji (bardzo rzadkich), że wygodniej jest samemu zrobić sekwencję i jej użyć niż użyć seriala.
depesz
-- quicksil1er: "postgres is excellent, but like any DB it requires a highly paid DBA. here's my CV!" :) http://www.depesz.com/ - blog dla ciebie (i moje CV)
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[MySQL] Wspolny primary key dla dwoch tabeli?
[MySQL] mam index, ale Foreign Key mowi, ze nie
MySQL 4.1 Foreign key z wartością null
MySQL + InnoDB + Foreign key i problem
[Mysql] primary & foreign key
Re: Jak uzyskać PRIMARY KEY ??
Primary i Foreign key w PostgreSQL
[MySQL 5.0] FOREIGN KEY
candidate key-jak przetlumaczyc?
autonumeracja primary key
zanotowane.pldoc.pisz.plpdf.pisz.pllunadance.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|