Možná, že by toto mělo spíše patřit do SQL, ale nevím jak na to přesně, zda-li se to nedělá i skriptem, takže to dám sem..
Zapíši záznam do MySQL tabulky, jenže používám relaci 1:1 a potřebuji si zjisit, jaké ID bylo naposledy přidanému prvku přiřazeno. Jak toto zjisit bezpečně bez totoho aniž bych to vybíral podle přidaných hodnot?
Můj SQL příkaz pro přidání si můžete předtsavit třeba takto, i když je to vlastně zcela zbytečné:
INSERT INTO lide (name, age) VALUES ('Jan', 20);
SELECT max(id) FROM lide ?
No, tohle znám samozřejmě také, ale co když bude server něják více vytížený a zrovna se někdo strefí mezi mé dva sql dotazy. Mezi přidání a mezi zjštění ID. Pokud toto nastane, tak je ejhle chyba na světě..
Neexistuje něco se 100%ní zárukou?
Jak je definovan ID? Pokud pouzivas auto_increment, tak je mozne ID ziskat PHP prikazem mysql_insert_id().
Jinak pokud ti jde o 100% spolehlivost, tak zkus pouzit transakce, ale to je na wz nefunkcni, protoze k tomu potrebujes innodb.
Ale mam pocit, ze ke konfliktu by nemelo dojit. Pri pouziti mysql_connect se vytvari novy proces a veskere operace pak jdou pres tento proces az to jeho zaniku mysql_close. Takze nikdo jiny by se do toho procesu nemel motat.
Ano, používám auto_increment.
Jak myslíš, že by se tam někdo neměl plést? Vždyť tam může být připojeno spousty uživatelů a já se obávám, že když se často pracuje s daty, tak se může stát, že nežli si zavolám fci mysql_insert_id(), tak tam už někdo v té milisekundě provede jiný mysql příkaz a ID bude rázem jiné.
Nebo toto má fce mysql_insert_id() něják ošetřené? Byl jsem totiž na jedné přednášce o MS SQL a tam se přednášející zmínil, že v této databázi to může nastat, i když je šance téměř nulová, ale přes to je..
Xili: ta funkce má zápis int mysql_insert_id ( [resource spojeni] ). Používá se pokud možni bezprostředně po INSERT dotazu a může obsahovat jako parametr identifikaci spojeni. Když ji nezadáš, použije se poslední. Takže stačí zadat connection id a získáš spolehlivý výsledek. Vrací jako číslo (int) id posledního autoinkrementovaného insertovaného řádku.
V manuálu k této funkci zmiňují i mysql dunkci LAST_INSERT_ID().
U slozitejsich projektu, kde se vyzaduje spolehlivost relaci, se pouziva prave transakce, ktera tohle osetruje. Proste veskere operace se provedou uvnitr transakce a nikdo jiny dovnitr te transakce nesmi.