Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL Wstawić do wielu tabel? (Normalizacja bazy danych?)

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:

  1. 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:

  2. 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, ...);
    
  3. 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ład mysql_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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak pobrać aktualną wersję systemu zarządzania bazą danych MySQL (DBMS)?

  2. Jak sprawdzić, czy baza danych mysql istnieje?

  3. Dołącz do nas w Amsterdamie na spotkanie z OptimaData i vidaXL

  4. Jak zainstalować MySQL 8 na Ubuntu 20.04 LTS?

  5. Jaka jest różnica między łączeniem oddzielonym przecinkami a łączeniem według składni w MySQL?