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.