sql >> Databáze >  >> RDS >> Mysql

Vložit MySQL do více tabulek? (Normalizace databáze?)

Ne, jedním příkazem MySQL nemůžete vkládat do více tabulek. Můžete však použít transakce.

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;

Podívejte se na LAST_INSERT_ID() znovu použít hodnoty automatického zvýšení.

Řekl jste "Po tak dlouhé době, kdy jsem se na to snažil přijít, to stále nefunguje. Nemůžu jednoduše vložit právě vygenerované ID do $var a vložit $var do všech příkazů MySQL? "

."

Dovolte mi to upřesnit:zde jsou 3 možné způsoby:

  1. V kódu, který vidíte výše. To vše v MySQL a LAST_INSERT_ID() v druhém příkazu bude automaticky hodnota sloupce automatického přírůstku, který byl vložen do prvního příkazu.

    Bohužel, když druhý příkaz sám vloží řádky do tabulky se sloupcem s automatickým přírůstkem, LAST_INSERT_ID() bude aktualizována na tabulku 2, nikoli na tabulku 1. Pokud budete i poté stále potřebovat tabulku 1, budeme ji muset uložit do proměnné. To nás vede ke způsobům 2 a 3:

  2. Bude skladovat LAST_INSERT_ID() v proměnné MySQL:

    INSERT ...
    SELECT LAST_INSERT_ID() INTO @mysql_variable_here;
    INSERT INTO table2 (@mysql_variable_here, ...);
    INSERT INTO table3 (@mysql_variable_here, ...);
    
  3. Bude skladovat LAST_INSERT_ID() v proměnné aphp (nebo v jakémkoli jazyce, který se může připojit k databázi, dle vašeho výběru):

    • INSERT ...
    • K získání LAST_INSERT_ID() použijte svůj jazyk , buď provedením tohoto doslovného příkazu v MySQL, nebo například pomocí php mysql_insert_id() který to udělá za vás
    • INSERT [use your php variable here]

UPOZORNĚNÍ

Ať už zvolíte jakýkoli způsob řešení, musíte se rozhodnout, co by se mělo stát pokud by bylo provádění mezi dotazy přerušeno (například dojde k selhání vašeho databázového serveru). Pokud dokážete žít s „někteří skončili, jiní ne“, nečtěte dál.

Pokud se však rozhodnete "buď všechny dotazy skončí, nebo žádný - nechci řádky v některých tabulkách, ale žádné odpovídající řádky v jiných, vždy chci, aby moje databázové tabulky byly konzistentní", musíte všechny příkazy zabalit do transakce . Proto jsem použil BEGIN a COMMIT zde.



  1. Jaké jsou výhody VistaDB

  2. Jak implementovat databázi SQLite pro ukládání bitmapového obrázku a textu?

  3. Časový limit dotazu SQL Server v závislosti na klauzuli Where

  4. Použití JDeveloper s databází MySQL a databází Oracle na AWS RDS, část 1