Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dodawanie rekordów
Forum PHP.pl > Forum > Bazy danych > MySQL
SamoChwała
Witam,

INSERT INTO tabela_1 (id_tab_1, pole_1, pole_2,........itd)

to wiem i nie ma problemu (działa, bo musi)

ale jak wstawić nowy rekord do dwóch (lub więcej) tabel będących w relacji.

dla przykładu tabela_2 ma pola (id_tabela_2, id_tabela_1, pole_x, pole_y)

Jak powinno wyglądać to MySQL, żeby do pola id_tabela_1 w tabela_2 wstawiany był ten sam rekord.

Dzieki za okazaną pomoc!!!
mhs
aby zapewnic pelna spojnosc danych musisz wykorzystac transakcje....

postepowanie (pisze teraz jak powinno to wygldac w wierszu polecen) wyglada w sposob nastepujacy:

  1. -- rozpoczecie transakcji
  2. SET AUTOCOMMIT = 0;
  3. BEGIN;
  4.  
  5. -- dodanie danych do tabeli pierwszej
  6. -- czyli jakis tutaj: INSERT INTO tabela_1 -- pobranie ostatnio wygenerowanego numeru id czyli:
  7. SELECT LAST_INSERT_ID();
  8.  
  9. -- dodanie danych do tabeli drugiej
  10. -- czyli INSERT INTO tabela 2
  11.  
  12. -- gdy wszystko zostalo poprawnie wykonane:
  13. COMMIT();
  14.  
  15. -- ewentualnie
  16. ROLLBACK();


mozna by tutaj pewnie stworzyc jakas procedure, przy czym nie znam sie na pisaniu takich rzeczy... z kolei utworzyc taka funkcje z wykorzystaniem php to nie bedzie specjalnie klopotow


edit:
jezeli chodzi o poprzedni watek to odpowiem troche pozniej gdyz w chwili obecnej mam pare rzeczy do zrobienia
halfik
zaleznie od tego w jaki sposob przebiega relacja, znaczy sie jaki jest zwiazek pomiedzy 2 obiektami, zaczynamy uzupelnianie danych od obiektu podrzednego, a nastepnie wprowadzamy dane do obiektu macierzystego np. tabela 1 zawiera klucz obcy z tabeli nr 2, wiec wpierw wprowadzamy dane do 2, a dopiero potem system pozwoli nam na dodanie rekoru do 1.
SamoChwała
W pierwszej chwili po przeczytaniu myslałem, że Twoja odp. jest żartem. Ciężko mi było zrozumieć jak to możliwe:
1. dodajemy nowy rekord do tabeli podrzędnej
2. dopiero teraz dodajemy nowy rekord do tabeli nadrzędnej

Wydawało mi się to nielogiczne ze względów na spójność danych obu tabel. Przeanalizowałem jednak obie wypowiedzi i zaczołem szukać wytłumaczenia.
Znalazłem w dokumentacji MySQL'a wersja 5 (jeszcze nieoficjalnej wersji) i dowiedziałem się, że transakcje wiązane (chyba dobrze zrozumiałem) będą dostepne dopiero od tej własnie wersji, a w obecnej 3.23 trzeba zrobić małe "oszustwo".

Wykombinowałem coś takiego i nie jestem pewny czy dobrze kombinuje (jeszcze nie działa).

Kod
$tabela_1_id = generate_key(); for each tabela_2 (id, pole_1, pole_2) INSERT INTO tabela_1 (id, pole_1, pole_2, pole_3) VALUES($tabela_1_id); INSERT INTO tabela_1 (id, pole_1, pole_2, pole_3) VALUES ($tabela_1_id);
mhs
to co napisal halfik jest wlasciwie slownym opisem tego co ja Ci zaprezentowalem...

jezeli chodzi o transakcje sa one dostepne juz od wersji 3.23.XX wiec mozna z nich korzystac...

pamietaj tylko, ze tabele musisz definiowac jako InnoDB, a chcac korzystac z transakcji (ktore zapewniaja spojnosc danych!!) musisz postepowac wg. przykladou ktory Ci zaprezentowalem...

aby korzystac z tych mechanizmow nie musisz posiadac wersji 5 (ktora niewiadomo kiedy pojawi sie w wersji stabilnej).. wystarczy korzystac z nowych dostepnych wersji mysql'a
spenalzo
Cytat(mhs @ 2004-07-30 12:41:13)
jezeli chodzi o transakcje sa one dostepne juz od wersji 3.23.XX wiec mozna z nich korzystac...

Chyba nie mówisz o MySQL tongue.gif
Transakcji w MySQL nie ma ani w wersjach 3.x ani 4.x - można je symulować za pomocą np. AdoDB.
mhs
Cytat(spenalzo @ 2004-07-31 03:24:42)
Cytat(mhs @ 2004-07-30 12:41:13)
jezeli chodzi o transakcje sa one dostepne juz od wersji 3.23.XX wiec mozna z nich korzystac...

Chyba nie mówisz o MySQL tongue.gif
Transakcji w MySQL nie ma ani w wersjach 3.x ani 4.x - można je symulować za pomocą np. AdoDB.

czy aby na pewno?

to wytlumacz mi czego przykladem jest powyzszy kod ktory zaprezentowalem w pierwszej odpowiedzi i jak ma Twoja odpowiedz do tego:
Transactions and Atomic Operations

nie wiem, moze ja tutaj czegos nie rozumiem, nie wiem...

bede wdzieczny za odpowiedz
spenalzo
Cytat
MySQL Server (version 3.23-max and all versions 4.0 and above) supports transactions with the InnoDB and BDB transactional storage engines.

Cytat
The other non-transactional storage engines in MySQL Server (such as MyISAM) follow a different paradigm for data integrity called ``atomic operations.'' In transactional terms, MyISAM tables effectively always operate in AUTOCOMMIT=1 mode. Atomic operations often offer comparable integrity with higher performance.

Mysql nie obsluguje transakcji za wyjatkiem powyższsch typów tabel (bo dla myisam czy innnych zawsze jest autocommit=1 czyli normalny insert bez możliwosci cofniecia). Czyli z punktu widzenia przecietnego użytkownika nie ma transakcji w MySQL. tongue.gif
halfik
obawiam sie ze spenzalo ma racje. transakcje maja byc w 5, przynajmniej takie sa zapowiedzi.

swoja droga dziwna sprawa, ze tak stary dbms, z tak doswiadczona rupa developerska, a do tej pory wlasnie transakcje, standard posrod standardow, byly wielka bolaczka...
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.