ďťż
 
duplicate key ďťż
 
duplicate key
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • lunadance.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com