Postgres i klucze (reindeksacja)
Piotrek_20 - 07-08-2007 00:01
Postgres i klucze (reindeksacja)
Uzywam pgAdmin do zarządzania postgresem 8.2 Dodając i usuwając rekordy z bazy zrobiło mi się tak ze pierwszy klucz mam juz 8xxx i są niepokolei np. 8001, 8003 Czy jest jakis sposób zeby zrobić automatyczną reindeksacje i wyczyścyc klucze tak zeby liczył od 0 i puste miejsca zmniejszył o wartosc? czyli zeby było 8001, 8002
hubert depesz lubaczewski - 07-08-2007 00:01
Dnia 06.08.2007 Piotrek_20 <anna_kotek@o2.pl> napisał/a: > Uzywam pgAdmin do zarządzania postgresem 8.2 > Dodając i usuwając rekordy z bazy zrobiło mi się tak ze pierwszy klucz > mam juz 8xxx i są niepokolei np. 8001, 8003 > Czy jest jakis sposób zeby zrobić automatyczną reindeksacje i > wyczyścyc klucze tak zeby liczył od 0 i puste miejsca zmniejszył o > wartosc? czyli zeby było 8001, 8002
sorry, ale może napisz jakoś precyzyjniej o co ci chodzi. bo z jednej strony piszesz o zmianie wartości w tabeli a z drugiej o reindeksacji - co ma się zasadniczo do tabeli nijak. z drugiej - jeśli chodzi ci o renumerowanie od 0, to skąd się tam w opisie wzięły liczby 8001 i 8002?
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)
Piotrek_20 - 07-08-2007 00:01
O co mi chodzi. Mam tabele a w niej rekordy z wartościami załóżmy 1,2,3,500,4050 itd. Gdybym tylko wstawiał to byłyby pokolei, ale czasem rekord jest usuwany a klucze są dostawiane, więc myślałem czy jest możliwośc tak jak w systemie zdefragmentować dysk, uporzadkowania tych kluczy tak ze puszczam porzadkowanie i baza wykrywa mi połączenia PK<->FK i poprawia wszystko tak, że będę miał: 1,2,3,4,5 a nie 1,2,3,500,4050
hubert depesz lubaczewski - 07-08-2007 00:01
Dnia 06.08.2007 Piotrek_20 <anna_kotek@o2.pl> napisał/a: > jak w systemie zdefragmentować dysk, uporzadkowania tych kluczy tak ze > puszczam porzadkowanie i baza wykrywa mi połączenia PK<->FK i poprawia > wszystko tak, że będę miał: > 1,2,3,4,5 a nie 1,2,3,500,4050
można zrobić takie coś update'em na tabeli, i jest to dosyć proste. powstaje tylko pytanie - a w czym ci dziury przeszkadzają?
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)
::-::dysmorfofob::-:: - 07-08-2007 00:01
> czy jest możliwośc [ciach] > uporzadkowania tych kluczy tak ze > puszczam porzadkowanie i baza wykrywa mi połączenia PK<->FK i poprawia > wszystko tak, że będę miał: > 1,2,3,4,5 a nie 1,2,3,500,4050
_Pomijajac celowosc (lub jej brak) takich dzialan._
Zakladajac, ze tabela wyglada +/- tak:
CREATE TABLE tabela
(id serial PRIMARY KEY);
oraz, ze klucze obce w innych tabelach maja ustawione ON UPDATE CASCADE
Przenumerowac mozna pole 'id' np. tak:
CREATE OR REPLACE FUNCTION wywal_dziury()
RETURNS VOID AS $$
DECLARE
kursor refcursor;
licznik integer;
najwiekszy integer;
kolejny integer;
BEGIN
-- licznik:=0; jesli ma byc koniecznie od zera
licznik:=1;
SELECT INTO najwiekszy max(id) FROM tabela;
OPEN kursor FOR SELECT id FROM tabela ORDER BY id DESC;
LOOP
FETCH kursor INTO kolejny;
IF NOT FOUND THEN
EXIT;
END IF;
UPDATE tabela SET id = najwiekszy + licznik WHERE id = kolejny;
licznik:=licznik +1;
END LOOP;
CLOSE kursor;
UPDATE tabela SET id = id - najwiekszy;
END;
$$
LANGUAGE 'plpgsql';
Na koniec pozostaje jeszcze tylko zmienic currval sekwencji dla pola 'id', aby uniknac powtorzen wartosci w kluczu glownym.
::f::
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[PostgreSQL] - jak =?ISO-8859-2?Q?zabezpieczy=E6_interesy_tw?==?ISO-8859-2?Q?=F3rcy_systemu_=3F=3F=3F?=
postgresql - int/int
postgresql Select count(*) czy raczej Select count(ID)
[PostgreSQL] jak =?ISO-8859-2?Q?pobra=E6_warto=B6=E6_zwracan?==?ISO-8859-2?Q?=B1_przez_funkcj=EA=3F?=
[postgresql] INSERT OR UPDATE - jak =?ISO-8859-2?Q?b=EAdzie_na?==?ISO-8859-2?Q?jlepiej=3F?=
[postgresql] kilka =?ISO-8859-2?Q?rekord=F3w_subquery_jako_?==?ISO-8859-2?Q?string?=
[PostgreSQL] Jak =?ISO-8859-2?Q?po=B3=B1czy=E6_funkcje_z_w?==?ISO-8859-2?Q?idokiem?=
Postgres - replikcja master-master
Dopasowanie do "najlepszego" dopasowania :) [ PostgreSQL]
Problemy z =?ISO-8859-2?Q?instalacj=B1_PostgreSQL_na_syste?==?ISO-8859-2?Q?mach_Windows?=
zanotowane.pldoc.pisz.plpdf.pisz.plfelgiuzywane.xlx.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 |
|