1

Temat: skopiowanie jednej tablicy do drugiej z sekwencją

cześć, mam problem ze skopiowaniem kilku kolumn z jednej tablicy do drugiej, mam takie tablice:

CREATE TABLE klienci
(
  idklienta character varying(10) NOT NULL,
  haslo character varying(10) NOT NULL,
  nazwa character varying(40) NOT NULL,
  miasto character varying(40) NOT NULL,
  kod character(6) NOT NULL,
  adres character varying(40) NOT NULL,
  email character varying(40),
  telefon character varying(16) NOT NULL,
  fax character varying(16),
  nip character(13),
  regon character(9)
)
CREATE TABLE h_klienci
(
  nrklienta serial NOT NULL,
  idklienta character varying(10) NOT NULL,
  nazwa character varying(40) NOT NULL,
  miasto character varying(40) NOT NULL,
  kod character(6) NOT NULL,
  CONSTRAINT h_klienci_pkey PRIMARY KEY (nrklienta)
)

dla tablicy h_klienci stworzyła się automatycznie z typu SERIAL sekwencja

CREATE SEQUENCE h_klienci_nrklienta_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;

problem w tym że, jak próbuję, skopiować wszystkie rekordy po częsci kolumn to nie wywala mi żadnego błędu, piszę że akcja się wykonała, ale danych nie wstawia, tylko zwiększa się index w sekwencji, (mam akurat 50 rekordów w tabeli klienci i o tyle się zwiększa index sekwencji)

INSERT INTO h_klienci (idklienta,nazwa,miasto,kod) SELECT idklienta,nazwa,miasto,kod FROM klienci

co robię źle? muszę jednak tą autonumerację jakoś recznie wygenerować w zapytaniu? czy w czym jest problem?
jak dodaje pojedynczy record już z konkretna daną zamiast selecta VALUE( ...) to dodaje normalnie, a jak robię przez selecta to nie chce dodać
z góry dziękuje za pomoc

2

Odp: skopiowanie jednej tablicy do drugiej z sekwencją

Dziwna sprawa, utworzyłem u siebie te tabele od zera, pododawałem trochę wierszy do tabeli klienci i wygląda na to, że Postgres jest w porządku pod tym względem:

INSERT INTO h_klienci (idklienta,nazwa,miasto,kod) SELECT idklienta,nazwa,miasto,kod FROM klienci;
INSERT 0 5 -- wstawione 5 wierszy do tabeli h_klienci
Select count(*) From h_klienci;
 count 
-------
     5
(1 row)
Select currval('h_klienci_nrklienta_seq');
 currval 
---------
       5
(1 row)

Jeżeli to coś ma pomóc (ale nie sądzę), to mam wersję 8.4. Tuż pod komendą insert powinieneś zobaczyć info typu INSERT 0 50, które wskazuje, że zostało dodane 50 wierszy do h_klienci, jeżeli tego nie ma, to nie za bardzo wiem co się dzieje, skoro SELECT zwraca te wiersze, to INSERT powinien je wziąć (abstrahując od samej sekwencji).

Ostatnio edytowany przez gszpetkowski (2011-12-08 21:31:54)

3

Odp: skopiowanie jednej tablicy do drugiej z sekwencją

dzięki serdeczne, bo naprowadziłeś mnie na błąd, zapytanie rzeczywiście jest dobre i działa, mój błąd że nie zauważyłem, że ten INSERT był w jakiejś transakcji i to wszystko przez to
jeszcze raz serdeczne dzięki za pomoc