Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: jak wykorzystać "Świeży" id jako dane do innej tabeli
Forum PHP.pl > Forum > Bazy danych > MySQL
acainoks
Witam wszystkich zainteresowanych problemem podejrzewam że nie tylko ja mam taki problem

Wysyłam do bazy danych dwa polecenia dodania danych do dwóch różnych tabel
PIERWSZA

ID_pierwsza|dane|dane|dane|dane

DRUGA

ID_druga|dane|dane|dane|ID_pierwsza

zależy mi na tym aby id_pierwsza trafiło jako dane do drugiej tabeli
czy można to zrobić za pomocą jakieś wbudowanej funkcji czy tez trzeba kombinować z procedurami i wyzwalaczami

dziękuję za zaangażowanie i pozdrawiam
artur_dziocha
Wykoarzystaj pozdapytanie
acainoks
Nh2003 nie wiem czy mysql_insert_id() jest dobrym pomysłem, załóżmy że mam więcej tabel i w każdej mam ID AUTO INCREMENT i do tego kilkaset użytkowników to wydaje mi się że jest taka możliwość że jakiś użytkownik się "wstrzeli" między insert do tabeli PIERWSZEJ i insert do tabeli DRUGIEJ i wtedy pobierze mu id niewłaściwy. Gdybym chciał np w niedalekim czasie przejść na id generowane ze znaków to mysql_insert_id() w ogóle odpada.

artur_dziocha możesz przybliżyć mi twój pomysł?

Bardziej interesuje mnie procedura która w jakiś sposób przypisuje nowy id do zmiennej w w tej samej procedurze go wykorzystuje jeżeli jest coś takiego możliwe.
artur_dziocha
Może coś taiego??
  1. $sql1 = "INSERT INTO PIERWSZA (dane11, dane12) VALUES (dane11, dane21);
  2. $sql2 = "INSERT INTO DRUGA (dane21, dane22, dane23, ID_pierwsza) VALUES (dane21, dane22, dane23, SELECT ID_pierwsza FROM PIERWSZA WHERE dane11=dane11 AND dane12=dane12);
acainoks
artur_dziocha na początek może być taka konstrukcja, nawet mam gdzieś podobną w innym miejscu

a może by spróbować czegoś takiego

  1. CREATE PROCEDURE proc ()
  2. BEGIN
  3. DECLARE zmienna_id CHAR;
  4.  
  5. INSERT INTO pierwsza (id_p) VALUES (''); //jakoś zaznaczyć teraz id_p INTO zmienna_id
  6. INSERT INTO druga (id_d, inne_id) VALUES ('',zmienna_id);
  7. END//


nie znam się tak bardzo na MySQL aby samemu sobie z tym poradzić a jeżeli ktoś wie że jest to niemożliwe w ten sposób to proszę mnie uświadomić smile.gif
pozdrawiam
#luq
@acainoks, wydaje mi się że tak właśnie nie jest, że można się wstrzelić pomiędzy zapytania jednego usera. W sumie nie wiem, ja stosuje mysql_insert_id() + transakcja oczywiście i problemów nie mam. Wydaje mi się, że przy transakcji takie coś nie jest możliwe, bo zapytania wykonują się zaraz po sobie...

Ja bym polecał
mysql_insert_id + transakcja
Mchl
Cytat(acainoks @ 8.07.2010, 09:57:34 ) *
Nh2003 nie wiem czy mysql_insert_id() jest dobrym pomysłem, załóżmy że mam więcej tabel i w każdej mam ID AUTO INCREMENT i do tego kilkaset użytkowników to wydaje mi się że jest taka możliwość że jakiś użytkownik się "wstrzeli" między insert do tabeli PIERWSZEJ i insert do tabeli DRUGIEJ i wtedy pobierze mu id niewłaściwy. Gdybym chciał np w niedalekim czasie przejść na id generowane ze znaków to mysql_insert_id() w ogóle odpada.


Nie ma takiej możliwości. Inaczej ta funkcja byłaby całkowicie bezużyteczna. Ostatnio wstawiony ID jest przechowywany dla każdego połączenia osobno i nie ma możliwości żeby dwóch różnych użytkowników pomieszało sobie nawzajem.

Tutaj dokładne objeaśnienie jak działa ta funkcja http://dev.mysql.com/doc/refman/5.1/en/inf..._last-insert-id

A po co miałbyś przechodzić na id generowane ze znaków? To znaczy wiem, że są ludzie którzy lubią utrudniać sobie życie, ale jestem ciekaw motywu.
prond
LAST_INSERT_ID to dobry pomysł, ale trzeba wszystko zrealizować w warstwie bazodanowej:

  1. BEGIN;
  2. INSERT INTO master (created) VALUES (NOW());
  3.  
  4. SET @myid = LAST_INSERT_ID();
  5.  
  6. INSERT INTO detail (master_id, title) VALUES (@myid, 'Johny');
  7. INSERT INTO detail (master_id, title) VALUES (@myid, 'Tonny');
  8. INSERT INTO detail (master_id, title) VALUES (@myid, 'Ronnie');
  9.  
  10. COMMIT;
Mchl
Dlaczego 'trzeba'?
acainoks
Jestem już przekonany do auto increment, bo w sumie po co sobie utrudniać tylko interesuje mnie jeszcze kwestia dwóch ostatnich postów czyli warstwy bazodanowej trzeba czy nie trzeba?
Mchl
Nie trzeba. Ani w bazie danych, ani w transakcji (aczkolwiek czasami trzeba w transakcji z innych powodów).

Warto poczytać link który wstawiłem powyżej, bo wyjaśnia wiele wątpliwości (na przykład co zwróci LAST_INSERT_ID() po wielowierszowym insercie).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.