autoincrement problem
23 отговора
830 прегледа
autoincrement problem
Problemyt e principen, i sigurno star kato sveta, no dosega ne se byah sblyskval s nego :-)
Znachi imam tablica, v koyato pyrvichniyat klyuch e autoincrement pole. Pravya INSERT. Kak moga da razbera s kakva stoynost na klyucha mi go e dobavilo? Ne, nyama nachin da identificiram unikalno reda po drugite poleta...
10x :-)
Znachi imam tablica, v koyato pyrvichniyat klyuch e autoincrement pole. Pravya INSERT. Kak moga da razbera s kakva stoynost na klyucha mi go e dobavilo? Ne, nyama nachin da identificiram unikalno reda po drugite poleta...
10x :-)
Re: autoincrement problem
S kwa baza? S Oracle znam pone 2 nachina. Drugia nachin e da ne se commitwa wednaga sled insert-a i da se naprawi select max() ... w systata tranzakcia. Towa raboti obache samo ako Autoincrement poleto ti e Primary ili Unique key. Ima spored men wariant kojto ne sym probwal e da se zakljchi tablicata, da se naprawi insert i select max() ... i da se otkljuchi. Toj e pochti ednakyw s prednia.
Dano sym pomognal!
Uspeh!

Dano sym pomognal!
Uspeh!
Re: autoincrement problem
MySQL
Last_insert_id
mysql> select last_insert_id();
API:
mysql_insert_id()
Linux is like a wigwam - No Windows, No Gates, Apache inside
Last_insert_id
mysql> select last_insert_id();
API:
mysql_insert_id()
Linux is like a wigwam - No Windows, No Gates, Apache inside
Re: autoincrement problem
Ne stava. Tryabva da e abs. prenosimo m/u razlichni SQL server-i, i da e s JDBC.
Re: autoincrement problem
Shte probvam pyrvoto, 10x. Vtoroto ne moga, shtoto LOCK ne e mnogo standartiziran...
P.P. Ne stava. Da obyasnyavam li zashto?
P.P. Ne stava. Da obyasnyavam li zashto?
Редактирано от Potencialen emigrant на
Re: Няма начин
Не всички сървъри поддържат auto_increment
Linux is like a wigwam - No Windows, No Gates, Apache inside
Linux is like a wigwam - No Windows, No Gates, Apache inside
Re: Няма начин
E dobre, znachi samo takiva, deto poddyrjat me interesuvat :-)
MySQL i PostgreSQL sa dva takiva. No sintaksisyt na LOCK im e razlichen...
MySQL i PostgreSQL sa dva takiva. No sintaksisyt na LOCK im e razlichen...
Re: No Lock
С MySQL нямаш нужда от Lock
last_insert_id e Session_safe
т.е. получаваш това което ти си вмъкнал независимо от другите процеси, които пишат в същото време.
Linux is like a wigwam - No Windows, No Gates, Apache inside
last_insert_id e Session_safe
т.е. получаваш това което ти си вмъкнал независимо от другите процеси, които пишат в същото време.
Linux is like a wigwam - No Windows, No Gates, Apache inside
realiziraj go s code ...
prawish si sequence table i posle algoritymyt e prost:
lock-wash tablicata
select-wash nextid stojnostta ot tablicata
ako nqma wyrnata stojnost, prawish nowa
inache wzimash tazi incrementwash, update-wash w tablicata
unlock-wash tablicata
/po princip takawa realizaciq se polzwa nawsqkyde i po wsicki codes, dokolkoto az sym wijdal, tyj kato last_insert_id funkciite na bazi kato mysql, postgresql i t.n. ne sa 100% sigurni, dori i da gi prawish absolutno wednaga/
lock-wash tablicata
select-wash nextid stojnostta ot tablicata
ako nqma wyrnata stojnost, prawish nowa
inache wzimash tazi incrementwash, update-wash w tablicata
unlock-wash tablicata
/po princip takawa realizaciq se polzwa nawsqkyde i po wsicki codes, dokolkoto az sym wijdal, tyj kato last_insert_id funkciite na bazi kato mysql, postgresql i t.n. ne sa 100% sigurni, dori i da gi prawish absolutno wednaga/
Re: realiziraj go s code ...
Хайде не говори групости като не разбираш.
Откъде го измисли това "Не са абсолютно сигурни"?
Покажи ми пример в MySQL.
Моля
Сега ако почнеш да ми разправяш, че то по принцип...
Ами по принцип компютрите правят грешки. Това май всички го знаем.
Друг е въпроса как LOCK-ваш таблица в която има 200-300 Insert-а в минута
Linux is like a wigwam - No Windows, No Gates, Apache inside
Откъде го измисли това "Не са абсолютно сигурни"?
Покажи ми пример в MySQL.
Моля
Сега ако почнеш да ми разправяш, че то по принцип...
Ами по принцип компютрите правят грешки. Това май всички го знаем.
Друг е въпроса как LOCK-ваш таблица в която има 200-300 Insert-а в минута
Linux is like a wigwam - No Windows, No Gates, Apache inside
Re: realiziraj go s code ...
Sigurni sa, shtoto za thread-dependent, t.e. dori i drug thread da insert-ne neshto, az shte si polucha moeto posledno ID.
Kakto i da e, s lock-vane syshto ne stava - nay-malkoto PostgreSQL i MySQL imat razlichen format na LOCK komandite.
Reshih si problema taka:
id-to ne e autoincrement. Ako iskam da dobavya red:
next_id = select max(id) from ...;
while (!success)
{
next_id++;
insert into ... set id=next_id;
}
Estestveno, s nyakakvo ogranichenie za max br. probi.
Kakto i da e, s lock-vane syshto ne stava - nay-malkoto PostgreSQL i MySQL imat razlichen format na LOCK komandite.
Reshih si problema taka:
id-to ne e autoincrement. Ako iskam da dobavya red:
next_id = select max(id) from ...;
while (!success)
{
next_id++;
insert into ... set id=next_id;
}
Estestveno, s nyakakvo ogranichenie za max br. probi.
Редактирано от Potencialen emigrant на
^_^
k, kato ne razbiram az - ok, ne iskam da sporq za gluposti (wypreki che ne e hubavo chovek da se opitwa winagi da e "otgore" i da e kompetenten)
no kaji togawa i na drugite, deto pishat php, phplib, pear i t.n., che ne go prawqt wqrno i ne e taka.
moje pyk i da se nawiqt ...
no kaji togawa i na drugite, deto pishat php, phplib, pear i t.n., che ne go prawqt wqrno i ne e taka.
moje pyk i da se nawiqt ...
Re: realiziraj go s code ...
predpolagam, che ne iskash da kajesh thread, a process, no kakto i da e ....
ti si reshawash (ne znaq dali mysql, primerno, e threadsafe)
towa sym go wijdal na dosta mesta i sym go chuwal ot dosta hora
ako namerq link kym statiq i code, ste ti go post-na
no, primerno, wyw wsqkakwi neshta sym go wijdal taka (phplib, pear i t.n.)
ti si reshawash (ne znaq dali mysql, primerno, e threadsafe)
towa sym go wijdal na dosta mesta i sym go chuwal ot dosta hora
ako namerq link kym statiq i code, ste ti go post-na
no, primerno, wyw wsqkakwi neshta sym go wijdal taka (phplib, pear i t.n.)
Re: ^_^
Znachi ako e taka, kakto go kazvash, izliza, che programistite na SQL server-ite sa mnogo zadrysteni.
Re: realiziraj go s code ...
Ne thread na procesa, polzvash SQL server-a, a thread (v smisyl na connection) na SQL server-a.
Re: ^_^
ne, no prosto takawa e realizaciqta i tekushtite nujdi
w oracle sequence-a si e otdelen object, koito manipulirash kakto namerish za dobre i, powqrwaj mi, wyrshi dosta poveche rabota ot insert_id-to, koeto mejdu drugoto e po-dobre da go wzimash ot bazata, a ne ot nqkakwo api (kato w php-to)
minusi: last_insert_id-to ti wyrshi rabota samo sled insert-i i update-i, no ne i pri select-i i set-owe
dori i w mysql manual-a pishat:
"This can be used to simulate sequences: First create the table:
mysql> create table sequence (id int not null);
mysql> insert into sequence values (0);
Then the table can be used to generate sequence numbers like this:
mysql> update sequence set id=LAST_INSERT_ID(id+1);"
ne sym kazal, che programistite sa zadrysteni, prosto ne e imalo nujda za baza kato mysql-a, primerno
no twoia wypros beshe obsht i zatowa ti predlojih da si realizirash sequence
ako byrkam nqkyde kaji mi, shte sym blagodaren
w oracle sequence-a si e otdelen object, koito manipulirash kakto namerish za dobre i, powqrwaj mi, wyrshi dosta poveche rabota ot insert_id-to, koeto mejdu drugoto e po-dobre da go wzimash ot bazata, a ne ot nqkakwo api (kato w php-to)
minusi: last_insert_id-to ti wyrshi rabota samo sled insert-i i update-i, no ne i pri select-i i set-owe
dori i w mysql manual-a pishat:
"This can be used to simulate sequences: First create the table:
mysql> create table sequence (id int not null);
mysql> insert into sequence values (0);
Then the table can be used to generate sequence numbers like this:
mysql> update sequence set id=LAST_INSERT_ID(id+1);"
ne sym kazal, che programistite sa zadrysteni, prosto ne e imalo nujda za baza kato mysql-a, primerno
no twoia wypros beshe obsht i zatowa ti predlojih da si realizirash sequence
ako byrkam nqkyde kaji mi, shte sym blagodaren
Re: Послушай AcidMemory :)
Без LOCK няма да минеш
Представи си 4 процеса които въртят твоето:
while (!success)
{
next_id++;
insert into ... set id=next_id; - - Syntax error :) insert into .... values(); set id=... e в update
}
Повечето сървъри ще Lock-ват при всеки INSERT (AcidMemory поправи ме ако бъркам) и ще ти се натрупат доста Lock-ове
Та ще ти се наложи да използваш транзакции в твоя случай а те също са нещо дето не всички сървъри поддържат да не говорим колко са различни реализациите.
Някъде бях виждал реализация със тригери ама не помня ...
Linux is like a wigwam - No Windows, No Gates, Apache inside
Представи си 4 процеса които въртят твоето:
while (!success)
{
next_id++;
insert into ... set id=next_id; - - Syntax error :) insert into .... values(); set id=... e в update
}
Повечето сървъри ще Lock-ват при всеки INSERT (AcidMemory поправи ме ако бъркам) и ще ти се натрупат доста Lock-ове
Та ще ти се наложи да използваш транзакции в твоя случай а те също са нещо дето не всички сървъри поддържат да не говорим колко са различни реализациите.
Някъде бях виждал реализация със тригери ама не помня ...
Linux is like a wigwam - No Windows, No Gates, Apache inside
Re: autoincrement problem
Ima edin proekt na Appche kym Jakarta Project-a. Ta toi aproekt se kazwa Turbine. Towa e Servlet i JSP Framework. Ta w Turbine ima edin tool, kojto se kazawa Torque. Toj generira Object Mapping na relacionna baza kym Java Obecti. W nego ima edin t.n. IdBroker. Toj se kriji za normaln i korektna generacia na ID-ta. Ako bazata ne poddyrja toj gi generira sam chrez dopylnitelna tablica. A ako poddyrja izpolzwa sobstenite i wyzmojnosti. Ima napisani obwiwki za naj-ppuliarnite. Predlagam ti da poglednesh tam: [линк]. Wypreki che ne e tochno kakwoto ti triabwa ste mojesh da widish sourceto i da go oprawish spored twojte nujdi!
Uspeh!

Uspeh!
Re: autoincrement problem
az imah problem s identity gaps v Sybase ASE
problema zasega e reshen s trigger na insert koito chete novoto id ot tablica
tova izdarzha dosta koshmaren stress testing
za postgres mozhe da polzvash nextval('sequence_name')
v MS SQL za tova sluzhi @@identity
P.S.
ako niakoi e imal problemi s identity gaps i e eshil problema ste seradvam da mi kazhe
problema zasega e reshen s trigger na insert koito chete novoto id ot tablica
tova izdarzha dosta koshmaren stress testing
za postgres mozhe da polzvash nextval('sequence_name')
v MS SQL za tova sluzhi @@identity
P.S.
ako niakoi e imal problemi s identity gaps i e eshil problema ste seradvam da mi kazhe