ďťż
 
[PostgreSQL] trigger autoincrement ďťż
 
[PostgreSQL] trigger autoincrement
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

[PostgreSQL] trigger autoincrement



Iyo - 06-01-2006 09:02
[PostgreSQL] trigger autoincrement
  witam,
chcialbym zrobic triggera w PostgreSQL ktory by
przed wstawieniem wiersza igrorowane bylo atrybut id
za to generowany by byl nowy o jeden wiekszy od poprzednio
przydzielonego

rozumiem ze latwo da sie to zrobic za pomoca sekwencji
ale problem polega na tym ze klucz glowny jest typu
char(6)
np:
'USR001'
oczywiscie kolejna wartocia powinno byc:
'USR002'

ktos moglby doradzic jak sie do tego zabrac (ewentualnie
podeslac kilka linii) , wczesniej
uzywalem Oracle'a i tam poradzilbym sobie z tym ale niestety
zycie zmusilo mnie do uzycia tym razem PostgreSQL'a (a nie mialem
z nim wiele stycznosci ) a sprawa
jest dosc pilna i nie mam wiele czasu na wertowanie sieci wiec
zwracam sie tutaj

dzieki z gory

pozdrawiam
Michał





Wojtek pBT (prac) - 06-01-2006 09:02

  Iyo napisał(a):
> witam,
> chcialbym zrobic triggera w PostgreSQL ktory by
> przed wstawieniem wiersza igrorowane bylo atrybut id
> za to generowany by byl nowy o jeden wiekszy od poprzednio
> przydzielonego
>
> rozumiem ze latwo da sie to zrobic za pomoca sekwencji
> ale problem polega na tym ze klucz glowny jest typu
> char(6)
> np:
> 'USR001'
> oczywiscie kolejna wartocia powinno byc:
> 'USR002'
>

Parafrazując FAQ:

depesz=# CREATE SEQUENCE b_id;
CREATE
depesz=# CREATE TABLE b (id char(6) not null default
CONCAT('USR',nextval('b_id')), pole text);
CREATE

Przy czym, CONCAT, na pewno istnieje w MySQL. W postgres też powinna.

Wróć, będzie brakowało zer prowadzących. Tego probelmu nie będzie jeżeli
liczenie zaczniesz od 100.
A może da sie jakos sformatowac liczbe, aby byla drukowana z zerami
wiadacymi...

> ktos moglby doradzic jak sie do tego zabrac (ewentualnie
> podeslac kilka linii) , wczesniej

ps, a nie lepiej Ci składać klucz główny z dwóch kolumn, jeżeli USR jest
zmienne, albo przy wybieraniu dodawać te USR

pBT




Iyo - 06-01-2006 09:03

  >
> depesz=# CREATE SEQUENCE b_id;
> CREATE
> depesz=# CREATE TABLE b (id char(6) not null default
> CONCAT('USR',nextval('b_id')), pole text);
> CREATE
>
> Przy czym, CONCAT, na pewno istnieje w MySQL. W postgres też powinna.

no tak wlasnie to zrobilem ;]

CREATE TABLE b (id char(6) not null default ('USR'::text ||
nextval('b_id')::text);

> Wróć, będzie brakowało zer prowadzących. Tego probelmu nie będzie jeżeli
> liczenie zaczniesz od 100.

na to tez wpadlem

> A może da sie jakos sformatowac liczbe, aby byla drukowana z zerami
> wiadacymi...

jak by ktos znalazl taka funkcje to niech da znac

tylko powyzsze rozwianie problem ze jesli ktos jawnie zdefinuje

INSERT INTO users(id_user,....) VALUES ('BABA11',...

to dupa z autoinkrementacja
ale ok, na razie takie prowizoryczne rozwiazanie musi mi wystarczyc

pozniej (jak obczaje jak sie pisze triggery w postgresie) dodam triggera
ktory ustawia NEW.id_user na NULL i bedzie wszyskto ok

w kazdym razie dzieki za odpowiedz

pozdrawiam
Michal




hubert depesz lubaczewski - 06-01-2006 09:03

  Dnia 05.01.2006 Iyo <iyo@o2.wiadomo.co> napisał/a:
>> A może da sie jakos sformatowac liczbe, aby byla drukowana z zerami
>> wiadacymi...
> jak by ktos znalazl taka funkcje to niech da znac

#v+
> select to_char(12::int4, '000');
to_char
---------
012
(1 row)
#v-

ale!:
> select to_char(1245::int4, '000');
to_char
---------
###
(1 row)

no ale to chyba oczywiscie - w końcu formatowanie na 3 cyfry ma dosyć
oczywiste ograniczenia.

> tylko powyzsze rozwianie problem ze jesli ktos jawnie zdefinuje
> INSERT INTO users(id_user,....) VALUES ('BABA11',...
> to dupa z autoinkrementacja
> ale ok, na razie takie prowizoryczne rozwiazanie musi mi wystarczyc
> pozniej (jak obczaje jak sie pisze triggery w postgresie) dodam triggera
> ktory ustawia NEW.id_user na NULL i bedzie wszyskto ok

nie będzie. ustawienie null'a nie wstawia wartości domyślnej tylko null'a.

ale:
#v+
> create SEQUENCE x_seq;
CREATE SEQUENCE

> create table x (id text not null default 'USR'||trim(to_char(nextval('x_seq'), '000')), cos text, primary key (id));
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "x_pkey" for table "x"
CREATE TABLE

> \d x
Table "public.x"
Column | Type | Modifiers
--------+------+-------------------------------------------------------------------------------------------
id | text | not null default ('USR'::text || btrim(to_char(nextval('x_seq'::regclass), '000'::text)))
cos | text |
Indexes:
"x_pkey" PRIMARY KEY, btree (id)

> insert into x (cos) values ('test1');
INSERT 0 1

> insert into x (id, cos) values ('dasdas', 'test2');
INSERT 0 1

> select * from x;
id | cos
--------+-------
USR001 | test1
dasdas | test2
(2 rows)

> create or replace function trg_func_x_bi() returns trigger as $BODY$
=> DECLARE
=> BEGIN
=> NEW.id := 'USR'||trim(to_char(nextval('x_seq'), '000'));
=> return NEW;
=> END;
=> $BODY$ language plpgsql;
CREATE FUNCTION

> CREATE TRIGGER trg_x_bi before insert on x for each row execute procedure trg_func_x_bi();
CREATE TRIGGER

> insert into x (cos) values ('test3');
INSERT 0 1

> insert into x (id, cos) values ('pcb-d', 'test4');
INSERT 0 1

> select * from x;
id | cos
--------+-------
USR001 | test1
dasdas | test2
USR003 | test3
USR004 | test4
(4 rows)
#v-

depesz

--
*------------------------------------------------------------------*
najwspanialszą rzeczą jaką dało nam nowoczesne społeczeństwo, jest
niesamowita wręcz łatwość unikania kontaktów z nim





Iyo - 06-01-2006 09:03

  ok, wielkie dzieki :D

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