2010-12-30 18 views
5

Ich bin neu in MySQL einzufügen, also bitte schön :)MySQL - Wie in mehrere Tabellen mit Fremdschlüsseln

Ich mag würde Daten aus einer PHP-Form in 3 verschiedene Tabellen einfügen, die alle ausländischen haben Schlüssel. Wie kann ich einen Einfügebefehl schreiben, der alle 3 Tabellen auf einmal aktualisiert, denn wenn ich versuche, eine Tabelle manuell zu aktualisieren, bekomme ich einen Fehler wegen der fehlenden Referenzen. Muss ich mit "NULL" -Einträgen umgehen und jede Tabelle nach der anderen aktualisieren oder ist es möglich, dies mit einem einzigen Befehl zu lösen? Wie MySQLi_Multi_Query?

Vielen Dank!

+0

Könnten Sie bitte den entsprechenden Abschnitt des Schemas posten? –

Antwort

5

Sie werden wahrscheinlich Dinge in der Reihenfolge ihrer Abhängigkeit einfügen müssen. Wenn Sie also drei Tabellen (A, B und C) haben, nehmen wir an, dass C von B abhängt und B von A abhängt. Wir nehmen auch an, dass jede Tabelle die Primärschlüssel AID, BID und CID hat.

  1. Sie würden Ihre Zeile in A einfügen und AID erhalten.
  2. Dann würden Sie Ihre Zeile in B mit der AID aus Schritt 1 einfügen.
  3. Dann würden Sie Ihre Zeile in C mit der BID (und vielleicht AID) aus Schritt 2 (und vielleicht 1
  4. )
+0

Vielen Dank. Das hat viel geholfen. – Crayl

+0

In Ihrer Weise müssen wir sql nacheinander ausführen, dies kann zu Leistungsproblemen führen. Gibt es eine Lösung, die alle diese verwandten Zeilen in einem sql einfügen kann? Jetzt denke ich, wenn ich jetzt eine Liste von AID ohne Einsatzreihen bekommen kann? – oppo

+0

Sie könnten in Bulk-Einfügungen mit MySQL suchen (ich habe nur Erfahrung damit in MSSQL). Dann könnten Sie alle drei Masseneinfügungen in eine Transaktion einbinden (wenn ein Fehler auftritt, werden alle zurückgesetzt) –

21

Sie können es in 3 Methoden tun:

Erste & empfohlen. Mit SELECT IM EINSATZ VALUE:

INSERT INTO user (name) 
    VALUES ('John Smith'); 
INSERT INTO user_details (id, weight, height) 
    VALUES ((SELECT id FROM user WHERE name='John Smith'), 83, 185); 

Zweite. VERWENDUNG DER LAST_INSERT_ID IM EINFÜGEWERT:

INSERT INTO a (id) 
    VALUES ('anything'); 
INSERT INTO user_details (id, weight, height) 
    VALUES (LAST_INSERT_ID(),83, 185); 

Drittens. PHP-Skript

<?php 
// Connecting to database 
$link = mysql_connect($wgScriptsDBServerIP, $wgScriptsDBServerUsername, $wgScriptsDBServerPassword, true); 
if(!$link || [email protected]_SELECT_db($wgScriptsDBName, $link)) { 
echo("Cant connect to server"); 
    exit; 
} 

// Values to insert 
$name = 'John Smith'; 
$weight = 83; 
$height = 185; 

// insertion to user table 
$sql = "INSERT INTO user (name) VALUES ('$name')"; 
$result = mysql_query($sql,$conn); 
// retrieve last id 
$user_id = mysql_insert_id($conn); 
mysql_free_result($result); 

// insertion to user_details table 
$sql = "INSERT INTO user_details (id, weight, height) VALUES ($user_id, $weight, $height)"; 
$result = mysql_query($sql,$conn); 
mysql_free_result($result); 
?> 
2

Es gibt einen Fehler in der Syntax für die Methode 1.

INSERT INTO user_details (id, weight, height) 
    VALUES (SELECT(id FROM user WHERE name='John Smith'), 83, 185); 

sollte

INSERT INTO user_details (id, weight, height) 
    VALUES ((SELECT id FROM user WHERE name='John Smith'), 83, 185); 
1

1) Der Sinn FOREIGN_KEY einen Wert zuzuordnen in einem Feld mit einem vorher vorhandenen Wert woanders. Sie sollten also Ihre Einsätze in einer logischen Reihenfolge erstellen.

2) Wenn Sie die logische Einschränkungen vermeiden möchten, sollten Sie

SET foreign_key_checks = 0 // disable key checks in server 
INSERT ... // any order 
INSERT ... 
... 
SET foreign_key_checks = 1 
Verwandte Themen