Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][mysql] Insert do dwóch tabel jednocześnie
Forum PHP.pl > Forum > PHP
dusty
Witam,

Ok, zobaczymy czy dacie tą kwestię rozwiązać. Mam dwie tabele - szkola i filia.

Układ tabeli szkoly

szkola_id, PK, automatyczne_numerowanie,
nazwa_szkoly char(40)
miasto char(10)

Układ tabeli filia

filia_id, PK, automatyczne_numerowanie
szkola_id
nazwa_filii char(10)


Mam tez stronę php i w ramach <form></form>, miejśce na wprowadzenia nazwa_szkoly, miasto, nazwa filli

INSERT musi jednocześnie wypełnic jedną i drugą tabelę, tylko że automatyczny numer pojawiający się w szkola_id tabeli szkola zostal tez zapisany pod szkola_id w tabeli filia.

Dzięki z góry za pomoc,
zakręcony
zanim wstawiasz rekord do tabeli szkoła, sprawdzasz jaki ma być nastepny szkola_id, jak już go znasz wstawiasz rekord do tabeli szkoła i wstawiasz rekord do tabeli filia
nevt
a co to według ciebie znaczy "MUSI JEDNOCZEŚNIE" ?? Równolegle na dwóch serwerach ?? w odstępie pikosekundy ?? czy tak, żeby użytkownik serwisu nie zobaczył szkoły bez filii (lub odwrotnie)??
Cytat
Ok, zobaczymy czy dacie tą kwestię rozwiązać.

poczytaj o START TRANSACTION, COMMIT, ROLLBACK...
zobaczymy czy potrafisz czytać ze zrozumieniem...
dusty
Chcę żeby dana filia zawsze była połączona z daną szkola. Tak ma to wyglądać w tabelach

szkola

szkola_id:235
szkoła_nazwa: Akademia Ekonowiczna
miasto: Wrocław

szkola_id:236
szkola_nazwa: Uniwersytet Slaski
miasto: Slask

filia

filia_id:23
szkola_id:235
miasto: Zabrze


Sam się nad tym dość długo zastanawiałem i duzo materiału szukałem, wszędzie pisze tylko o insert do jednej tabeli ale nigdzie od dwóch jednocześnie.

Zastanawiam się czy w ramamch MySQL 4.1+ można zastosować CASCADE, i czy to by problem nie rozwiązało (mssql server)

Wtedy filia.szkola_id byłaby FK dla szkola.szkola_id oraz cascade on insert, update, delete dla filia.szkola_id.

Dzięki,
nevt
no i bardzo dobrze to wymyśliłeś - tą relację szkoła - filie... ale rozwiązaniem twojego problemu nie jest INSERT do wielu tabel JEDNOCZEŚNIE - bo coś takiego nie istnieje. od tego są tzw. TRANZAKCJE (patrz mój porzedni post). najpierw otwierasz tranzakcję, robisz sobie wiele zmian na swoich tabelach (czyli NAJPIERW dopisujesz szkołę, SPRAWDZASZ pod jakim ID się dopisała, PÓŹNIEJ robisz odpowiedni wpis filii). w trakcie tych wszystkich operacji inni uzytkownicy systemu nie widzą żadnych zmian... na koniec zamykasz tranzakcję i od tego momentu WSZYSTKIE wprowadzone wcześniej zmiany stają się widoczne dla pozostałych użytkowików bazy. z ich punktu widzenia wygląda, jakbyś wszystkie wcześniejsze operacje wykonał jednocześnie, w momencie zamknięcia tranzakcji...

powodzenia... a przy okazji - kto cię uczył korzystać z relacyjnych baz danych i nie wspomniał o tranzakcjach? winksmiley.jpg
dusty
Dzieki wielkie, a żeby podejrzeć szkola.szkola_id stosuje mysql_last_inserted. Tak? Czy jest inny sposób na to?

Znalazłem coś takiego:

INSERT INTO foo (auto,text)
VALUES(NULL,'text'); # generate ID by inserting NULL
INSERT INTO foo2 (id,text)
VALUES(LAST_INSERT_ID(),'text'); # use ID in second table

I mógłbym to zrobic w ramach transakcji, tylko mnie zastanawia tylko jedno. Czy Last_Insert_Id będzie dotyczył ostatniego id w tabeli szkola w ramach transakcji, czy ostatniego id powstałego w bazie, niezaleznie od tabeli w której tabeli. Może przykład lepiej to wyjaśni.

Bo jeżeli tak to powiedzmy że stworzymy kolejną tabele: uczen (uczen_id, uczen_name).

Uzytkownik A rozpoczyna transakcję A - dotyczy wprowadzenia danych do tabel szkola i filia.
Użytkownik B rozpoczyna transakcję B - dotyczy wprowadzenie danych do tabeli uczen.

I teraz powiedzmy że przebieg wydarzeń jest następujący

Transakcja A - insert into szkola....
Transakcja B - insert into uczen...
Transakcja A - insert into filia (szkola_id) values (last_insert_id)

Czy last_insert_id będzie ostatni id powstały w tabeli szkola czy tabeli uczeń?

Ok, już to zbadałem - odnosi się do last_inserted_id() w ramach danej transakcji. Tylko że mogę tylko dokonać jedna filię do jednej uczelni naraz, inaczej za last_inerted_id druga wprowadzona filia uzna id ostatnio wprowadzonej fili w ramach tej transakcji a nie ostatni id szkoly.

ok, last_insert_id, występuje w ramach transakcji, inne zmianny nawet w tej samej tabeli nie mają na niej wpływ. Tylko problerm jest taki że możemy tylko dodać jedną filię na szkole w ramach jednej transakcji. Inaczej last_insert_id będzie miało wartość ostatniej id filii a nie szkoly.
nevt
LAST_INSERT_ID() możesz odczytać w PHP i użyć później przy budowie zapytań dodających kolejne filie / uczniów... polecam lekturę mysql_insert_id() lub mysqli_insert_id()

pozdrawiam i powodzenia.
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.