Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

mySQL-ov last_insert_id() i pitanje

[es] :: MySQL :: mySQL-ov last_insert_id() i pitanje

[ Pregleda: 3955 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

milosijaa
Milos djordjevic
PHP Developer
srbija

Član broj: 88371
Poruke: 135
*.dialup.neobee.net.



Profil

icon mySQL-ov last_insert_id() i pitanje10.02.2007. u 17:31 - pre 208 meseci
ovo je moj SQL upit.
sema relacije

person(id, name) - id je PK i AUTO INCREMENT
shirt(id, type, color, id_person) - id PK AUTOINCREMENT

Popunjavam tabele:

INSERT INTO person VALUES (NULL, 'Antonio Paz');

INSERT INTO shirt VALUES
(NULL, 'polo', 'blue', LAST_INSERT_ID()),
(NULL, 'dress', 'white', LAST_INSERT_ID()),
(NULL, 't-shirt', 'blue', LAST_INSERT_ID());


Kada ih izvrsim svako bi ocekivao da u tabeli shirt poslednja kolona ima vrednost primarnog kljuca iz tabele person. ALI NIJE TAKO!!!

Dakle posto izvrsim ova dva upita dobijem :

----------------*
Table person *
*************
1, 'Antonio Paz' *
----------------*

--------------------
Table shirt *
****************
1, 'polo', 'blue', 0 *
2, 'dress', 'white', 1 *
3, 't-shirt', 'blue', 2 *
--------------------

Gde gresim????

Ovo je inace primer iz MySQL-ovo Reference Manual-a.
 
Odgovor na temu

Dejan Topalovic
Dejan Topalović
Senior Oracle DBA & Senior PL/SQL
Developer, Erste Sparinvest (Erste
Bank), Vienna, Austria
Vienna

Član broj: 635
Poruke: 1374
*.1.14.vie.surfer.at.

Sajt: www.baze-podataka.net


+2 Profil

icon Re: mySQL-ov last_insert_id() i pitanje10.02.2007. u 18:06 - pre 208 meseci
Hm, kod mene sve radi kako treba:
Code:

C:\>mysql -u dejan -p test
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 5.0.24a-community-nt-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create table person(id int primary key auto_increment, name varchar(32));

Query OK, 0 rows affected (0.03 sec)

mysql> create table shirt(id int primary key auto_increment, 
    -> type varchar(8), color varchar(16), id_person int);
Query OK, 0 rows affected (0.00 sec)

mysql> insert into person values(null, 'Antonio Paz');
Query OK, 1 row affected (0.01 sec)

mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                1 |
+------------------+
1 row in set (0.00 sec)

mysql> insert into shirt values(null,'polo',blue', LAST_INSERT_ID()), 
    -> (null, 'dress','white', LAST_INSERT_ID()), 
    -> (null, 't-shirt','blue', LAST_INSERT_ID());
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from shirt;
+----+---------+-------+-----------+
| id | type    | color | id_person |
+----+---------+-------+-----------+
|  1 | polo    | blue  |         1 |
|  2 | dress   | white |         1 |
|  3 | t-shirt | blue  |         1 |
+----+---------+-------+-----------+
3 rows in set (0.00 sec)

mysql>

Blog - baze podataka
---------------------
Oracle OCP DBA (9i & 10g)
Oracle Database: SQL Certified Expert
Oracle OCP Developer
Certified MySQL DBA
 
Odgovor na temu

milosijaa
Milos djordjevic
PHP Developer
srbija

Član broj: 88371
Poruke: 135
*.dialup.neobee.net.



Profil

icon Re: mySQL-ov last_insert_id() i pitanje10.02.2007. u 23:53 - pre 208 meseci
hehe pa ovako radi i kod mene.

ALi mi i dalje nije jasno zasto to nece da radi i u MySQL Query Browser-u vec izbaci ono sto sam nakucao ???
 
Odgovor na temu

milosijaa
Milos djordjevic
PHP Developer
srbija

Član broj: 88371
Poruke: 135
*.DIALUP-SMIN.neobee.net.



Profil

icon Re: mySQL-ov last_insert_id() i pitanje11.02.2007. u 02:52 - pre 208 meseci
a sta kazes na ovo CUDO!!!

Enter password: ****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 111 to server version: 5.0.21-community-nt

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use test;
Database changed
mysql> CREATE TABLE person
-> ( id integer not null AUTO_INCREMENT,
-> name varchar(30) not null,
-> primary key(id));
Query OK, 0 rows affected (0.00 sec)

mysql> create table shirt
-> ( id integer not null auto_increment,
-> type varchar(8),
-> color varchar(16),
-> id_person integer,
-> primary key(id));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into person values(null,'pera peric');
Query OK, 1 row affected (0.00 sec)

mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 1 |
+------------------+
1 row in set (0.00 sec)

mysql> insert into shirt values(null,'polo','red',last_insert_id()),
-> (null,'t-shirt','black',last_insert_id()),
-> (null,'dress','yellow',last_insert_id());
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> select * from shirt;
+----+---------+--------+-----------+
| id | type | color | id_person |
+----+---------+--------+-----------+
| 1 | polo | red | 1 |
| 2 | t-shirt | black | 1 |
| 3 | dress | yellow | 2 |<**************** ODAKLE OVA DVOJKA
+----+---------+--------+-----------+
3 rows in set (0.00 sec)

mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 1 |
+------------------+
1 row in set (0.00 sec)

mysql>
 
Odgovor na temu

Dejan Topalovic
Dejan Topalović
Senior Oracle DBA & Senior PL/SQL
Developer, Erste Sparinvest (Erste
Bank), Vienna, Austria
Vienna

Član broj: 635
Poruke: 1374
*.1.14.vie.surfer.at.

Sajt: www.baze-podataka.net


+2 Profil

icon Re: mySQL-ov last_insert_id() i pitanje11.02.2007. u 11:27 - pre 208 meseci
Hm, nemam pojma stvarno. LAST_INSERT_ID() vazi samo za trenutnu konekciju i nemoguce je da ti neka druga konekcija u medjuvremenu poveca vrijednost za 1.
Ako ovo nije bug (a mislim da jeste, jer sam vidjao neke probleme sa LAST_INSERT_ID() na nekim forumima), onda stvarno ne znam odakle ta dvojka. :)

Da probas sa nekom novijom verzijom MySQL-a ili da koristis user varijablu:
Code:

INSERT INTO person VALUES( NULL, 'Antonio Paz');

SELECT @ID := LAST_INSERT_ID();

insert into shirt values(null,'polo','red', @ID),
 (null,'t-shirt','black', @ID),
(null,'dress','yellow', @ID);




Blog - baze podataka
---------------------
Oracle OCP DBA (9i & 10g)
Oracle Database: SQL Certified Expert
Oracle OCP Developer
Certified MySQL DBA
 
Odgovor na temu

milosijaa
Milos djordjevic
PHP Developer
srbija

Član broj: 88371
Poruke: 135
80.74.160.*



Profil

icon Re: mySQL-ov last_insert_id() i pitanje11.02.2007. u 13:35 - pre 208 meseci
problem sam delimicno resio.

ako u tabeli shirt nemam kolonu koja je definisana kao AUTO_INCREMENT sve radi savrseno.

ps
SELECT @ID := LAST_INSERT_ID(); ...... ne pomaze :(

 
Odgovor na temu

stsung
NS

Član broj: 12899
Poruke: 432
*.ADSL.neobee.net.



+2 Profil

icon Re: mySQL-ov last_insert_id() i pitanje11.02.2007. u 13:55 - pre 208 meseci
Pozd.

Citat:
Re: mySQL-ov last_insert_id() i pitanje
a sta kazes na ovo CUDO!!!

....
mysql> select * from shirt;
+----+---------+--------+-----------+
| id | type | color | id_person |
+----+---------+--------+-----------+
| 1 | polo | red | 1 |
| 2 | t-shirt | black | 1 |
| 3 | dress | yellow | 2 |<**************** ODAKLE OVA DVOJKA
+----+---------+--------+-----------+


Ta dvojka je upravo LAST_INSERT_ID() od prethodne genedisane auto increment vrednosti, a to je 2 (t-shirt,black). Prvo polje u shirt tabeli je jelda auto increment.

Svako dobro.

[Ovu poruku je menjao misk0 dana 11.02.2007. u 17:41 GMT+1]
 
Odgovor na temu

Dejan Topalovic
Dejan Topalović
Senior Oracle DBA & Senior PL/SQL
Developer, Erste Sparinvest (Erste
Bank), Vienna, Austria
Vienna

Član broj: 635
Poruke: 1374
*.1.14.vie.surfer.at.

Sajt: www.baze-podataka.net


+2 Profil

icon Re: mySQL-ov last_insert_id() i pitanje11.02.2007. u 20:12 - pre 208 meseci
@stsung: Po tvojoj teoriji bi onda 2 trebala biti za unos 't-shirt','black', a ne za zadnji unos... Nesto mi to ne pije vode...

@milosijaa: Ne znam zasto kod tebe ne radi, jer kod mene radi perfektno:
Code:

C:\>mysql -u dejan -p test
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 189 to server version: 5.0.24a-community-nt-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> drop table person;
Query OK, 0 rows affected (0.08 sec)

mysql> drop table shirt;
Query OK, 0 rows affected (0.03 sec)

mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                0 |
+------------------+
1 row in set (0.00 sec)

mysql> create table person(id int primary key auto_increment, 
    -> name varchar(32));

Query OK, 0 rows affected (0.02 sec)

mysql> create table shirt(id int primary key auto_increment,
    -> type varchar(8), color varchar(16), id_person int);
Query OK, 0 rows affected (0.00 sec)

mysql> insert into person values(null, 'Antonio Paz');
Query OK, 1 row affected (0.02 sec)

mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                1 |
+------------------+
1 row in set (0.00 sec)

mysql> select @id := last_insert_id();
+-------------------------+
| @id := last_insert_id() |
+-------------------------+
|                       1 |
+-------------------------+
1 row in set (0.00 sec)

mysql> select @ID;
+------+
| @ID  |
+------+
| 1    |
+------+
1 row in set (0.00 sec)

mysql> insert into shirt values(null,'polo','blue', @ID),
    -> (null, 'dress','white', @ID),
    -> (null, 't-shirt','blue', @ID);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from shirt;
+----+---------+-------+-----------+
| id | type    | color | id_person |
+----+---------+-------+-----------+
|  1 | polo    | blue  |         1 |
|  2 | dress   | white |         1 |
|  3 | t-shirt | blue  |         1 |
+----+---------+-------+-----------+
3 rows in set (0.00 sec)

mysql>

Blog - baze podataka
---------------------
Oracle OCP DBA (9i & 10g)
Oracle Database: SQL Certified Expert
Oracle OCP Developer
Certified MySQL DBA
 
Odgovor na temu

stsung
NS

Član broj: 12899
Poruke: 432
*.nspoint.net.



+2 Profil

icon Re: mySQL-ov last_insert_id() i pitanje13.02.2007. u 18:01 - pre 208 meseci
Pozd.

Citat:
@stsung: Po tvojoj teoriji bi onda 2 trebala biti za unos 't-shirt','black', a ne za zadnji unos... Nesto mi to ne pije vode...


U trenutku unosa 't-shirt','black' poslednje generisana auto-increment vrednost je ona od prethodnog uspešno insertovanog row-a, a to je 'polo','red', odnosno vrednost 1. Zbog toga se u koloni `id_person` od row-a 't-shirt','black' nalazi vrednost 1. U trenutku insertovanja row-a 't-shirt','black' generishe se nova auto increment vrednost (2), i u trenutku insertovanja narednog row-a 'dress','yellow' vrednost last insert id iznosi upravo 2. Nema tu šta da pije vode, tako funkcioniše :)

Svako dobro.
 
Odgovor na temu

Dejan Topalovic
Dejan Topalović
Senior Oracle DBA & Senior PL/SQL
Developer, Erste Sparinvest (Erste
Bank), Vienna, Austria
Vienna

Član broj: 635
Poruke: 1374
*.1.14.vie.surfer.at.

Sajt: www.baze-podataka.net


+2 Profil

icon Re: mySQL-ov last_insert_id() i pitanje13.02.2007. u 19:59 - pre 208 meseci
@stsung: A odakle onda 1 za red 'polo','red', kad se i pri unosu tog reda koristi LAST_INSERT_ID() ? Onda bi po tvojoj teoriji vrijednost kolone id_person za vrijednost 'polo','red' trebala biti 1, zatim za 't-shirt','black' bi trebala biti 2, a za zadnju kombinaciju 'dress','yellow' bi trebala biti 3.
Nakon sto se cjelokupan insert obavi, vrijednost LAST_INSERT_ID() bi trebala da vrati broj 4, je l' tako?

Mozes li uraditi na svom serveru ovako korak po korak, da kreiras tabele i uneses podatke, pa da nam kopiras rezultat, jer meni ovo nema nikakve logike...
Blog - baze podataka
---------------------
Oracle OCP DBA (9i & 10g)
Oracle Database: SQL Certified Expert
Oracle OCP Developer
Certified MySQL DBA
 
Odgovor na temu

milosijaa
Milos djordjevic
PHP Developer
srbija

Član broj: 88371
Poruke: 135
*.dialup.neobee.net.



Profil

icon Re: mySQL-ov last_insert_id() i pitanje14.02.2007. u 00:04 - pre 208 meseci
stvarno nemam pojma zasto se ovako ponasa. Moracu da instaliram noviju verziju MySQL-a. Na zalost ne jos jer sam u sred neceg i ne bih dodatne probleme.

U svakom slucaju hvala momci :)
 
Odgovor na temu

stsung
NS

Član broj: 12899
Poruke: 432
*.ADSL.neobee.net.



+2 Profil

icon Re: mySQL-ov last_insert_id() i pitanje14.02.2007. u 02:28 - pre 208 meseci
Pozd.

Citat:
@stsung: A odakle onda 1 za red 'polo','red', kad se i pri unosu tog reda koristi LAST_INSERT_ID() ? Onda bi po tvojoj teoriji vrijednost kolone id_person za vrijednost 'polo','red' trebala biti 1, zatim za 't-shirt','black' bi trebala biti 2, a za zadnju kombinaciju 'dress','yellow' bi trebala biti 3.
Nakon sto se cjelokupan insert obavi, vrijednost LAST_INSERT_ID() bi trebala da vrati broj 4, je l' tako?


Potebno je uochiti sledece:

Code:
mysql> insert into person values(null,'pera peric');
Query OK, 1 row affected (0.00 sec)


U ovom upitu, generisala se autoincrement vrednost pri unosu pere perica, i ta vrednost je 1. Kako ista sesija i dalje traje kada je izvrshen naredni query, pri unosu prvog row-a last increment sadrzhi poslednju generisanu auto increment vrednost, a to je vrednost iz prethodnog upita, odnosno 1. Sledeca generisana autoincrement vrednost je opet 1, pri unosu 'polo',red' row-a.

Svako dobro.
 
Odgovor na temu

Dejan Topalovic
Dejan Topalović
Senior Oracle DBA & Senior PL/SQL
Developer, Erste Sparinvest (Erste
Bank), Vienna, Austria
Vienna

Član broj: 635
Poruke: 1374
*.it-austria.net.

Sajt: www.baze-podataka.net


+2 Profil

icon Re: mySQL-ov last_insert_id() i pitanje14.02.2007. u 08:57 - pre 208 meseci
@stsung: Sorry, al ne ne shvatam bas taj princip, za koji ti tvrdis da LAST_INSERT_ID() funkcionise. Mozes li na jednom primjeru pokazati, kako se kod tebe generisu te vrijednosti? Dakle, create table person, pa create table shirt, pa insertujes i kopiras nam rezultat...
Blog - baze podataka
---------------------
Oracle OCP DBA (9i & 10g)
Oracle Database: SQL Certified Expert
Oracle OCP Developer
Certified MySQL DBA
 
Odgovor na temu

stsung
NS

Član broj: 12899
Poruke: 432
*.nspoint.net.



+2 Profil

icon Re: mySQL-ov last_insert_id() i pitanje14.02.2007. u 17:39 - pre 208 meseci
Pozd.

Sledi sesija:

Code:

Database changed
mysql> CREATE TABLE person
    -> ( id integer not null AUTO_INCREMENT,
    -> name varchar(30) not null,
    -> primary key(id));
Query OK, 0 rows affected (0.09 sec)

mysql> create table shirt
    -> ( id integer not null auto_increment,
    -> type varchar(8),
    -> color varchar(16),
    -> id_person integer,
    -> primary key(id));
Query OK, 0 rows affected (0.02 sec)

mysql> insert into person values(null,'pera peric');
Query OK, 1 row affected (0.00 sec)

mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                1 |
+------------------+
1 row in set (0.00 sec)            

mysql> insert into shirt values(null,'polo','red',last_insert_id()),
    -> (null,'t-shirt','black',last_insert_id()),
    -> (null,'dress','yellow',last_insert_id());
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from shirt;
+----+---------+--------+-----------+
| id | type    | color  | id_person |
+----+---------+--------+-----------+
|  1 | polo    | red    |         1 |
|  2 | t-shirt | black  |         1 |
|  3 | dress   | yellow |         2 |
+----+---------+--------+-----------+
3 rows in set (0.00 sec)


E sad, poshto je polemika malo poodmakla, reko da isprobam vishe varijanti, pa sam probao i na MySQL 5.0.27, tu je svuda u id_person vrednost 1. Izgleda da je promenjen nachin osvezhavanja increment vrednosti u ovoj verziji (gornja sesija je sa verzije 4.1.20). Kod usera milosijaa je verzija 5.0.21 i ponashanje je isto, kod tebe 5.0.24a i ponashanje kao kod mene na 5.0.27 - tu negde izmedju 21 i 24 su izgleda nachinili promenu.

Pogledao sam malo dublje, i bio si u pravu - ipak je greshka da se na poziciji dress,yellow nadje vrednost 2, jer kako je navedeno u dokumentaciji, pri insertu vishe recorda, last_increment_id() ce vracati auto increment vrednost od prve generisane vrednosti tog upita, a ne poslednje. LAST_INSERT_ID() bismo onda mogli opisati ovako: vraca prvu generisanu auto increment vrednost iz poslednjeg upita u kome je doshlo do generisanja auto increment vrednosti :) Tu treba imati na umu da odredjeni upiti mogu da ovu vrednost u potpunosti ponishte.

I na 4.1.20 nakon inserta 3 recorda u shirt, last_insert_id() iznosi 1. Iz svega toga mozhe se zakljuchiti da je ovo bio najverovatnije bug do te neke 5.0.2x verzije koji je ispravljen - pretpostavljam da se pri insertu recorda tshirt,black last insert vrednost u memoriji servera promeni na 2 jer je to zaista poslednja generisana auto increment vrednost koju onda server koristi da bi generisao narednu (inkrementuje je za definisanu increment vrednost, obichno 1), ali nakon zavrshenog upita, kao shto je definisano, postavlja se na prvu generisanu vrednost odnosno 1. Verovatno su odvojili u posebnu internu varijablu poslednje generisanu vrednost kako bi se ispravio bug.

Zakljuchak, ne treba se oslanjati na ovo i koristiti pri upitima da bi se izbegle chudne greshke. Nachin na koji je Dejan Topalovic prikazao, (select @id := last_insert_id();) i korishcenje varijable @id je najsigurnije. Isto tako, zarad ochuvanog integriteta, ove stvari bi trebalo raditi pomocu transakcija.

Svako dobro.
 
Odgovor na temu

milosijaa
Milos djordjevic
PHP Developer
srbija

Član broj: 88371
Poruke: 135
*.dialup.neobee.net.



Profil

icon Re: mySQL-ov last_insert_id() i pitanje24.04.2007. u 11:08 - pre 206 meseci
Problem SOLVED!

)
 
Odgovor na temu

[es] :: MySQL :: mySQL-ov last_insert_id() i pitanje

[ Pregleda: 3955 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.