Próbowałem szukać insert
informacji w wielu tabelach w tym samym zapytaniu, ale okazało się, że jest to niemożliwe? Więc chcę to insert
zrobić, używając po prostu wielu zapytań tj;
INSERT INTO users (username, password) VALUES('test', 'test')
INSERT INTO profiles (userid, bio, homepage) VALUES('[id of the user here?]','Hello world!', 'http://www.stackoverflow.com')
Ale jak mogę dać automatycznego przyrostu id
przeprowadzoną users
do „ręcznego” userid
na profile
stole?
Odpowiedzi:
Nie, nie możesz wstawiać do wielu tabel za pomocą jednego polecenia MySQL. Możesz jednak korzystać z transakcji.
Zobacz,
LAST_INSERT_ID()
jak ponownie wykorzystać wartości autoincrement.Edycja: powiedziałeś " Po tylu próbach rozwiązania tego problemu nadal nie działa. Czy nie mogę po prostu umieścić właśnie wygenerowanego identyfikatora w zmiennej $ var i wstawić go do wszystkich poleceń MySQL? "
Pozwól mi rozwinąć: są tutaj 3 możliwe sposoby:
W kodzie, który widzisz powyżej. Robi to wszystko w MySQL, a
LAST_INSERT_ID()
w drugiej instrukcji automatycznie będzie wartość kolumny autoincrement, która została wstawiona w pierwszej instrukcji.Niestety, gdy druga instrukcja sama wstawia wiersze w tabeli z kolumną autoinkrementacji,
LAST_INSERT_ID()
zostanie zaktualizowana do tabeli 2, a nie do tabeli 1. Jeśli nadal będziesz potrzebować tego z tabeli 1, będziemy musieli ją zapisać w zmiennej. To prowadzi nas do dróg 2 i 3:Będzie
LAST_INSERT_ID()
przechowywać w zmiennej MySQL:Będzie
LAST_INSERT_ID()
przechowywać w zmiennej php (lub w dowolnym języku, który może łączyć się z bazą danych, według twojego wyboru):INSERT ...
LAST_INSERT_ID()
, albo wykonując tę dosłowną instrukcję w MySQL, albo używając na przykład php,mysql_insert_id()
który robi to za CiebieINSERT [use your php variable here]
OSTRZEŻENIE
Niezależnie od wybranego sposobu rozwiązania tego problemu, musisz zdecydować, co powinno się stać w przypadku przerwania wykonywania między zapytaniami (na przykład awarii serwera bazy danych). Jeśli możesz żyć z „niektórzy skończyli, inni nie”, nie czytaj dalej.
Jeśli jednak zdecydujesz „albo zakończono wszystkie zapytania, albo żadne - nie chcę wierszy w niektórych tabelach, ale nie chcę pasujących wierszy w innych, zawsze chcę, aby moje tabele bazy danych były spójne”, musisz zawrzeć wszystkie instrukcje w transakcji. Dlatego użyłem
BEGIN
iCOMMIT
tutaj.Skomentuj ponownie, jeśli potrzebujesz więcej informacji :)
źródło
@mysql_variables
w połączeniu z przygotowanymi instrukcjami?dość proste, jeśli używasz procedur składowanych:
pełny skrypt:
źródło
Co by się stało, gdybyś chciał stworzyć wiele takich rekordów (aby zarejestrować 10 użytkowników, a nie tylko jednego)? Znajduję następujące rozwiązanie (tylko 5 zapytań):
Krok I: Utwórz tabelę tymczasową do przechowywania nowych danych.
Następnie wypełnij tę tabelę wartościami.
Tutaj zamiast
$ALL_VAL
Ciebie umieść listę wartości: ('test1', 'test1', 'bio1', 'home1'), ..., ('testn', 'testn', 'bion', 'homen')Krok II: Wyślij dane do tabeli „user”.
Tutaj można użyć "IGNORE", jeśli pozwolisz niektórym użytkownikom być już w środku. Opcjonalnie możesz użyć UPDATE podobnie jak w kroku III, przed tym krokiem, aby znaleźć użytkowników, którzy są już w środku (i zaznaczyć ich w tabeli tmp). Tutaj zakładamy, że nazwa użytkownika jest zadeklarowana tak, jak
PRIMARY
w tabeli użytkowników.Krok III: Zastosuj aktualizację, aby odczytać wszystkie identyfikatory użytkowników od użytkowników do tabeli tmp. TO NIEZBĘDNY KROK.
Krok IV: Utwórz kolejną tabelę, używając identyfikatora odczytu dla użytkowników
źródło
Spróbuj tego
Referencje
PHP
MYSQL
źródło
spójrz na mysql_insert_id ()
tutaj dokumentacja: http://in.php.net/manual/en/function.mysql-insert-id.php
źródło
LAST_INSERT_ID()
programisty?To jest sposób, w jaki zrobiłem to dla projektu uni, działa dobrze, prawdopodobnie nie jest bezpieczny
}
źródło
Tylko uwaga na temat twojego słowa
Czy jesz wszystkie dania na lunch zmieszane z napojami w tej samej misce?
Przypuszczam - nie.
To samo tutaj.
Są rzeczy, które robimy osobno.
2 zapytania wprowadzające to 2 zapytania wprowadzające. W porządku. Nie ma w tym nic złego. Nie ma potrzeby mieszania go w jednym.
To samo dotyczy wyboru. Zapytanie musi być rozsądne i działać. To jedyne powody. Liczba zapytań nie jest.
Jeśli chodzi o transakcje - możesz z nich korzystać, ale nie jest to taka wielka sprawa dla przeciętnej witryny internetowej. Jeśli zdarzyło się raz w roku (jeśli w ogóle), że jedna rejestracja użytkownika została zerwana, bez wątpienia będziesz w stanie to naprawić.
istnieją setki tysięcy witryn z mysql bez sterownika obsługującego transakcje. Czy słyszałeś o strasznych katastrofach, które rozdzielały te strony? Ja też nie.
A mysql_insert_id () nie ma nic wspólnego z transakcjami. możesz w pełni włączyć do transakcji. to tylko inne sprawy. Ktoś zadał to pytanie nie wiadomo skąd.
źródło
That function is the devil of database consistency.
zrobiłeś, a nie transakcje. Nie widzę nic złego w transakcjach.W przypadku PDO możesz to zrobić
źródło