sql >> Database teknologi >  >> RDS >> Mysql

MySQL Indsætte i flere tabeller? (Databasenormalisering?)

Nej, du kan ikke indsætte i flere tabeller i en MySQL-kommando. Du kan dog bruge 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;

Tag et kig på LAST_INSERT_ID() for at genbruge autoincrement-værdier.

Du sagde "Efter al den tid, hvor jeg har prøvet at finde ud af det, virker det stadig ikke. Kan jeg ikke bare lægge det netop genererede ID i en $var og sætte den $var i alle MySQL-kommandoer? "

Lad mig uddybe:der er 3 mulige måder her:

  1. I koden du ser ovenfor. Dette gør det hele i MySQL ogLAST_INSERT_ID() i den anden sætning vil automatisk være værdien af ​​den autoincrement-kolonne, der blev indsat i den første sætning.

    Desværre, når den anden sætning selv indsætter rækker i en tabel med en kolonne med automatisk stigning, vil LAST_INSERT_ID() vil blive opdateret til tabel 2, og ikke tabel 1. Hvis du stadig har brug for tabel 1 efterfølgende, bliver vi nødt til at gemme den i en variabel. Dette fører os til veje 2 og 3:

  2. Lager 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. Lager LAST_INSERT_ID() i aphp-variabel (eller et hvilket som helst sprog, der kan oprette forbindelse til en database efter eget valg):

    • INDSÆT ...
    • Brug dit sprog til at hente LAST_INSERT_ID() , enten ved at udføre den bogstavelige sætning i MySQL, eller ved at bruge for eksempel phps mysql_insert_id() som gør det for dig
    • INSERT [brug din php-variabel her]

ADVARSEL

Uanset hvilken måde du vælger at løse dette på, skal du beslutte, hvad der skal ske hvis udførelsen afbrydes mellem forespørgsler (for eksempel går din database-server ned). Hvis du kan leve med "nogle er færdige, andre ikke", så lad være med at læse videre.

Hvis du imidlertid beslutter dig for "enten afsluttes alle forespørgsler, eller ingen afsluttes - jeg vil ikke have rækker i nogle tabeller, men ingen matchende rækker i andre, jeg vil altid have, at mine databasetabeller er konsistente", skal du pakke alle udsagn i en transaktion . Det er derfor, jeg brugte BEGIN og COMMIT her.



  1. Sådan får du datoen fra en streng i Oracle

  2. Sådan kontrolleres, om der findes en tabel i SQLite

  3. SQLiteDatabase-fejl, uhensigtsmæssig log

  4. T-SQL:søger efter e-mail-format