dusty
27.12.2007, 00:47:16
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
27.12.2007, 07:08:28
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
27.12.2007, 07:50:17
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
27.12.2007, 09:10:29
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
27.12.2007, 10:51:20
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?
dusty
27.12.2007, 12:25:32
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
27.12.2007, 12:36:20
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.