2010-12-30 15 views
5

I'am nowych do MySQL, więc proszę być miły :)MySQL - Jak wstawić do wielu tabel z kluczy obcych

chciałbym wstawić dane z formularza php na 3 różnych tabel, które mają zagranicznych klawiatura. Jak mogę napisać polecenie wstawiania, które aktualizuje wszystkie 3 tabele naraz, ponieważ jeśli spróbuję ręcznie zaktualizować tabelę, to otrzymam błąd z powodu brakujących odniesień. Czy muszę zajmować się pozycjami "NULL" i aktualizować każdą tabelę po drugiej, czy też można to rozwiązać za pomocą pojedynczego polecenia? Jak MySQLi_Multi_Query?

Dziękuję bardzo!

+0

mógłbyś pisać odpowiedni fragment schematu? –

Odpowiedz

5

Najprawdopodobniej będziesz musiał wstawiać rzeczy w kolejności ich zależności. Jeśli więc masz trzy tabele (A, B i C), zakładamy, że C zależy od B i B zależy od A. Przyjmiemy też, że każda tabela ma klucze podstawowe odpowiednio AID, BID i CID.

  1. Wstawisz wiersz do A i uzyskasz POMOC.
  2. Następnie wstawiasz swój wiersz do B, używając AID z kroku 1.
  3. Następnie wstawiasz swój wiersz do litery C, używając identyfikatora BID (i być może AID) z kroku 2 (i być może 1)
+0

Dziękuję bardzo. To pomogło dużo. – Crayl

+0

Na swój sposób musimy wykonać sql jeden po drugim, może to spowodować problemy z wydajnością. Czy istnieje rozwiązanie, które może wstawić wszystkie te powiązane wiersze w jednym sql? Teraz myślę, czy mogę teraz uzyskać listę AID bez wierszy wstawiania? – oppo

+0

Możesz zajrzeć do insertów zbiorczych za pomocą MySQL (mam tylko doświadczenie z tym w MSSQL). Wtedy możesz zawinąć wszystkie trzy inserty do transakcji (więc jeśli się nie uda, wszystkie zostaną wycofane) –

21

można to zrobić w 3 wariantach:

Pierwszy & Zalecana. Za pomocą przycisku SELECT w wartości INSERT:

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); 

sekundę. KORZYSTANIE Z LAST_INSERT_ID W VALUE WARTOŚCI:

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

Trzeci. Używając PHP SCRIPT

<?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

wystąpił błąd w składni dla metody 1.

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

powinny być

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

1) Poczucie foreign_key jest skojarzyć wartości w polu z wartością pre_istniejącą gdzie indziej. Więc powinieneś zrobić swoje wstawki w logicznej kolejności.

2) Jeśli chcesz uniknąć ograniczeń logicznych należy

SET foreign_key_checks = 0 // disable key checks in server 
INSERT ... // any order 
INSERT ... 
... 
SET foreign_key_checks = 1 
Powiązane problemy