[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.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.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 |
|