Nie, nie możesz wstawiać do wielu tabel w jednym poleceniu MySQL. Możesz jednak użyć transakcji.
BEGIN;
INSERT INTO users (username, password)
VALUES('test', 'test');
INSERT INTO profiles (userid, bio, homepage)
VALUES(LAST_INSERT_ID(),'Hello world!', 'http://www.stackoverflow.com');
COMMIT;
Spójrz na LAST_INSERT_ID()
aby ponownie użyć wartości autoinkrementacji.
Powiedziałeś:„Po tylu próbach rozwiązania tego nadal nie działa. Czy nie mogę po prostu umieścić właśnie wygenerowanego identyfikatora w zmiennej $var i umieścić tę $var we wszystkich poleceniach MySQL? "
Pozwól, że rozwinę:są tutaj 3 możliwe sposoby:
-
W kodzie, który widzisz powyżej. Robi to wszystko w MySQL i
LAST_INSERT_ID()
w drugiej instrukcji będzie automatycznie wartość kolumny autoincrement, która została wstawiona do pierwszej instrukcji.Niestety, gdy druga instrukcja sama wstawia wiersze do tabeli z kolumną autoinkrementacji,
LAST_INSERT_ID()
zostanie zaktualizowany do tabeli 2, a nie tabeli 1. Jeśli później nadal będziesz potrzebować tabeli 1, będziemy musieli zapisać ją w zmiennej. To prowadzi nas do dróg 2 i 3: -
Będzie magazynować
LAST_INSERT_ID()
w zmiennej MySQL:INSERT ... SELECT LAST_INSERT_ID() INTO @mysql_variable_here; INSERT INTO table2 (@mysql_variable_here, ...); INSERT INTO table3 (@mysql_variable_here, ...);
-
Będzie magazynować
LAST_INSERT_ID()
w zmiennej aphp (lub dowolnym języku, który może łączyć się z bazą danych, według Twojego wyboru):WSTAW...
- Użyj swojego języka, aby pobrać
LAST_INSERT_ID()
, albo wykonując tę instrukcję w MySQL, albo używając na przykładmysql_insert_id()
php który robi to za Ciebie INSERT [użyj tutaj swojej zmiennej php]
OSTRZEŻENIE
Niezależnie od wybranego sposobu rozwiązania tego problemu, musisz zdecydować, co powinno się stać, jeśli wykonanie zostanie przerwane między zapytaniami (na przykład awaria serwera bazy danych). Jeśli możesz żyć z „niektórzy skończyli, inni nie”, nie czytaj dalej.
Jeśli jednak zdecydujesz "albo wszystkie zapytania się kończą, albo żadne - nie chcę wierszy w niektórych tabelach, ale żadnych pasujących wierszy w innych, zawsze chcę, aby moje tabele bazy danych były spójne", musisz ująć wszystkie instrukcje w transakcji . Dlatego użyłem BEGIN
i ZATWIERDZ
tutaj.