sql >> Databasteknik >  >> RDS >> Mysql

MySQL Infoga i flera tabeller? (Databasnormalisering?)

Nej, du kan inte infoga i flera tabeller i ett MySQL-kommando. Du kan dock använda transaktioner.

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;

Ta en titt på LAST_INSERT_ID() för att återanvända autoinkrementvärden.

Du sa "Efter all den här tiden som jag har försökt ta reda på det fungerar det fortfarande inte. Kan jag inte helt enkelt lägga in det nyss genererade ID:t i en $var och lägga den $var i alla MySQL-kommandon? "

Låt mig utveckla:det finns tre möjliga sätt här:

  1. I koden du ser ovan. Detta gör allt i MySQL och LAST_INSERT_ID() i det andra påståendet kommer automatiskt att vara värdet för den autoinkrement-kolumn som infogades i det första påståendet.

    Tyvärr, när den andra satsen själv infogar rader i en tabell med en kolumn för automatisk ökning, visas LAST_INSERT_ID() kommer att uppdateras till tabell 2, och inte tabell 1. Om du fortfarande behöver det i tabell 1 efteråt, måste vi lagra det i en variabel. Detta leder oss till sätt 2 och 3:

  2. Kommer att lagra LAST_INSERT_ID() i en MySQL-variabel:

    INSERT ...
    SELECT LAST_INSERT_ID() INTO @mysql_variable_here;
    INSERT INTO table2 (@mysql_variable_here, ...);
    INSERT INTO table3 (@mysql_variable_here, ...);
    
  3. Kommer att lagra LAST_INSERT_ID() i aphp-variabel (eller vilket språk som helst som kan ansluta till en databas efter eget val):

    • INSERT ...
    • Använd ditt språk för att hämta LAST_INSERT_ID() , antingen genom att köra den bokstavliga satsen i MySQL, eller använda till exempel phps mysql_insert_id() som gör det åt dig
    • INSERT [använd din php-variabel här]

VARNING

Vilket sätt du än väljer att lösa detta måste du bestämma vad som ska hända om exekveringen avbryts mellan frågorna (till exempel kraschar din databasserver). Om du kan leva med "en del har slutat, andra inte", läs inte vidare.

Om du däremot bestämmer dig för "antingen avslutas alla frågor eller slutar ingen - jag vill inte ha rader i vissa tabeller men inga matchande rader i andra, jag vill alltid att mina databastabeller ska vara konsekventa", måste du slå in alla uttalanden i en transaktion . Det är därför jag använde BEGIN och COMMIT här.



  1. Hur man listar tabell främmande nycklar

  2. MySQL-datakällan visas inte i Visual Studio

  3. Kolumnantal matchar inte värderäkning på rad 1

  4. Välj första raden i varje grupp i sql