autoincrement problem

23 отговора 830 прегледа
#1

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 :-)

Отговор
в отговор на Potencialen emigrant #2

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!

Отговор
в отговор на Potencialen emigrant #3

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
Отговор
в отговор на salle #4

Re: autoincrement problem

Ne stava. Tryabva da e abs. prenosimo m/u razlichni SQL server-i, i da e s JDBC.

Отговор
в отговор на Lubo_R #5

Re: autoincrement problem

Shte probvam pyrvoto, 10x. Vtoroto ne moga, shtoto LOCK ne e mnogo standartiziran...

P.P. Ne stava. Da obyasnyavam li zashto?

Редактирано от Potencialen emigrant на

Отговор
в отговор на Potencialen emigrant #6

Re: Няма начин

Не всички сървъри поддържат auto_increment

Linux is like a wigwam - No Windows, No Gates, Apache inside
Отговор
в отговор на salle #7

Re: Няма начин

E dobre, znachi samo takiva, deto poddyrjat me interesuvat :-)
MySQL i PostgreSQL sa dva takiva. No sintaksisyt na LOCK im e razlichen...

Отговор
в отговор на Potencialen emigrant #8

Re: No Lock

С MySQL нямаш нужда от Lock

last_insert_id e Session_safe
т.е. получаваш това което ти си вмъкнал независимо от другите процеси, които пишат в същото време.

Linux is like a wigwam - No Windows, No Gates, Apache inside
Отговор
в отговор на Potencialen emigrant #10

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/

Отговор
в отговор на AcidMemory #11

Re: realiziraj go s code ...

Хайде не говори групости като не разбираш.
Откъде го измисли това "Не са абсолютно сигурни"?

Покажи ми пример в MySQL.
Моля

Сега ако почнеш да ми разправяш, че то по принцип...
Ами по принцип компютрите правят грешки. Това май всички го знаем.

Друг е въпроса как LOCK-ваш таблица в която има 200-300 Insert-а в минута

Linux is like a wigwam - No Windows, No Gates, Apache inside
Отговор
в отговор на AcidMemory #12

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.

Редактирано от Potencialen emigrant на

Отговор
в отговор на salle #13

^_^

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

Отговор
в отговор на Potencialen emigrant #14

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

Отговор
в отговор на AcidMemory #15

Re: ^_^

Znachi ako e taka, kakto go kazvash, izliza, che programistite na SQL server-ite sa mnogo zadrysteni.

Отговор
в отговор на AcidMemory #16

Re: realiziraj go s code ...

Ne thread na procesa, polzvash SQL server-a, a thread (v smisyl na connection) na SQL server-a.

Отговор
в отговор на Potencialen emigrant #17

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

Отговор
в отговор на Potencialen emigrant #18

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
Отговор
в отговор на Potencialen emigrant #19

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!

Отговор
в отговор на Potencialen emigrant #20

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

Отговор