[SQLITE] kilka =?ISO-8859-2?Q?p=F3l_autoincrement_lub_sekw?==?ISO-8859-2?Q?encje?=
=?ISO-8859-2?Q?Marcin_Luboja=F1ski?= - 30-03-2007 00:07
[SQLITE] kilka =?ISO-8859-2?Q?p=F3l_autoincrement_lub_sekw?==?ISO-8859-2?Q?encje?=
Witam Potrzebuję kilku pól autoincremental w tabeli. Czytałem http://www.sqlite.org/cvstrac/wiki/w...UnsupportedSql gdzie piszą że czegoś takiego w SQLite nie ma i że można to zrobić samemu przez sekwencje (których SQLite tez nie obsługuje). Na końcu adnotacja że zostało to dodane w SQLite 3.1. Niestety jest to tak napisane że ja nie wiem co zostało dodane. Bo kilku pól autoincremental nie można dodać a sekwencji też nie ma.
Może ktoś miał podobny problem i rozwiązał bo jakoś sensownie?
Pozdrawiam Marcin Lubojański
=?ISO-8859-2?Q?Jaros=B3aw_Staniek?= - 30-03-2007 00:07
Marcin Lubojański said the following, On 2007-03-29 13:24:
> Potrzebuję kilku pól autoincremental w tabeli. Czytałem > http://www.sqlite.org/cvstrac/wiki/w...UnsupportedSql gdzie pisząże > czegoś takiego w SQLite nie ma i że można to zrobić samemu przez > sekwencje (których SQLite tez nie obsługuje). > Na końcu adnotacja że zostało to dodane w SQLite 3.1. > Niestety jest to tak napisane że ja nie wiem co zostało dodane. Bo kilku > pól autoincremental nie można dodać a sekwencji też nie ma.
Witam, Pomyślalem sobie rozwiążę ten problem bo i tak w Kexi będę chciał mieć obsługę dowolnej wartości autoincement spoza klucza podstawowego, w dowolnej liczbie.
Oto przyklad rozwiazania na triggerach, jako że w SQLite w wielu rzeczach pomagają triggery (moze istnieje prostsze):
Zalozmy ze chcesz miec tabele 'test' z polami a i b - oba autoincrement ale nie PK. Potrzebny jeden trigger na pole.
----------- CREATE TABLE test (a integer, b integer, txt text);
CREATE TRIGGER test_a_seq_trigger AFTER INSERT ON test FOR EACH ROW BEGIN update test set a=(ifnull((select max(a)+1 from test), 1)) where rowid=new.rowid and new.a isnull; END;
CREATE TRIGGER test_b_seq_trigger AFTER INSERT ON test FOR EACH ROW BEGIN update test set b=(ifnull((select max(b)+1 from test), 1)) where rowid=new.rowid and new.b isnull; END;
insert into test values (null, null, 'foo'); insert into test values (null, 7, 'bar'); insert into test values (null, null, 'text');
select * from test; a|b|txt 1|1|foo 2|7|bar 3|8|text -----------
Notki: 2-gi INSERT wstawia jawnie wartosc 7 - zeby nie modyfikowac jej potrzebny byl warunek 'new.b isnull' triggera. rowid=new.rowid zmienia tylko wstawiony wiersz. Uzycie ifnull() jest potrzebne, by bylo z czym wystartowac, gdy tabela jest pusta.
Co do wydajności to koszt max() jest stały, a ciało triggera jest (AFAIK) zamieniane na mikrokod przy pierwszym uzyciu.
To rozwiazanie mi sie podoba bo mozna ustawic "skok" sekwencji, wlaczeniez malejąca oraz wartosc poczatkową. Inna zaleta to ta, ze wszystko sie dzieje po stronie "serwera" i bez patchowania sqlite.
PS: W Kexi pewnie użyję niejawnie w/w mechanizmu do obslugi zapytan wjezyku KEXISQL (pewien podzbior SQL):
CREATE TABLE test (a integer autoincrement, b integer autoincrement, txt text); ^^^^^^^^^^ ^^^^^^^^^^ (tzn. triggery beda sie niejawnie tworzyc).
-- regards / pozdrawiam, Jaroslaw Staniek Sponsored by OpenOffice Polska (http://www.openoffice.com.pl/en) to work on Kexi & KOffice: http://www.kexi.pl/en, http://www.koffice.org KDE3 & KDE4 Libraries for MS Windows: http://kdelibs.com, http://www.kde.org
=?ISO-8859-2?Q?Marcin_Luboja=F1ski?= - 31-03-2007 00:06
Jarosław Staniek wrote: > Marcin Lubojański said the following, On 2007-03-29 13:24: > >> Potrzebuję kilku pól autoincremental w tabeli. Czytałem >> http://www.sqlite.org/cvstrac/wiki/w...UnsupportedSql gdzie piszą że >> czegoś takiego w SQLite nie ma i że można to zrobić samemu przez >> sekwencje (których SQLite tez nie obsługuje). >> Na końcu adnotacja że zostało to dodane w SQLite 3.1. >> Niestety jest to tak napisane że ja nie wiem co zostało dodane. Bo kilku >> pól autoincremental nie można dodać a sekwencji też nie ma. > > Witam, > Pomyślalem sobie rozwiążę ten problem bo i tak w Kexi będę chciał mieć > obsługę dowolnej wartości autoincement spoza klucza podstawowego, w > dowolnej liczbie. > > Oto przyklad rozwiazania na triggerach, jako że w SQLite w wielu > rzeczach pomagają triggery (moze istnieje prostsze): > > Zalozmy ze chcesz miec tabele 'test' z polami a i b - oba autoincrement > ale nie PK. Potrzebny jeden trigger na pole. > > ----------- > CREATE TABLE test (a integer, b integer, txt text); > > CREATE TRIGGER test_a_seq_trigger AFTER INSERT ON test FOR EACH ROW > BEGIN update test set a=(ifnull((select max(a)+1 from test), 1)) where > rowid=new.rowid and new.a isnull; END; > > CREATE TRIGGER test_b_seq_trigger AFTER INSERT ON test FOR EACH ROW > BEGIN update test set b=(ifnull((select max(b)+1 from test), 1)) where > rowid=new.rowid and new.b isnull; END; > > insert into test values (null, null, 'foo'); > insert into test values (null, 7, 'bar'); > insert into test values (null, null, 'text');
Dzięki wielkie. Nie wpadłem na to że można zrobić sobie triggera z emulowaną sekwencją ;-D
Pozdrawiam Marcin Lubojański -- www.tramping.slask.pl www.duzy-biust.pl
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Wydajność baz danych w zależności od poziomu izolacji ANSI/ISO
Czy zna (obsługuje) ktoś program Iso Draw ?
MYSQL - kodowanie w ISO-PL
strona plus baza w iso do utf-8
Kodowanie: z iso na utf
Kilka podstawowych =?UTF-8?B?cHl0YcWEIG8gbG9nb3dhbmllIHXFvHl0a293?==?UTF-8?B?bmlrw7N3?=
Jak wyciągnąć fragment grafiki (klatka, kilka sekund video) z pliku
Gimp -> duzy obraz na kilka mniejszych WWW pilne !!!
[MySQL] przeniesc kilka baz do jednej - jak najlepiej?
[sql] kilka tabel -> jedna tabela
zanotowane.pldoc.pisz.plpdf.pisz.plwawa19wwa91.pev.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 |
|