2010-12-30 17 views
5

Soy nuevo a MySQL, así que por favor ser agradable :)MySQL - Cómo insertar en varias tablas con claves externas

quisiera insertar datos de un formulario php en 3 mesas diferentes, todos los cuales tienen extranjera llaves. ¿Cómo puedo escribir un comando de inserción que actualiza las 3 tablas a la vez, porque si trato de actualizar una tabla manualmente, entonces aparece un error debido a las referencias que faltan? ¿Tengo que lidiar con las entradas "NULL" y actualizar cada tabla después de otra o es posible resolver esto con un solo comando? Como MySQLi_Multi_Query?

Muchas gracias!

+0

Podría, por favor publicar la sección correspondiente del esquema? –

Respuesta

5

Es muy probable que tenga que insertar elementos en orden de su dependencia. Entonces, si tiene tres tablas (A, B y C), supondremos que C depende de B y B depende de A. También asumiremos que cada tabla tiene claves principales AID, BID y CID, respectivamente.

  1. Se podría insertar la fila en A y obtener la AID.
  2. Luego insertaría su fila en B usando la AYUDA que recibió del paso 1.
  3. Luego insertaría su fila en C usando la BID (y tal vez la AYUDA) que recibió del paso 2 (y tal vez 1)
+0

Muchas gracias. Eso ayudó mucho. – Crayl

+0

En su camino, tenemos que ejecutar SQL uno por uno, esto puede causar problemas de rendimiento. ¿Hay alguna solución que pueda insertar todas estas filas relacionadas en un sql? Ahora, estoy pensando, si puedo obtener una lista de AID sin insertar filas en este momento? – oppo

+0

Puede buscar inserciones masivas con MySQL (solo tengo experiencia en MSSQL). Luego podría envolver las tres inserciones masivas en una transacción (por lo que si una falla, todas se revierten) –

21

puede hacerlo en 3 Métodos:

Primera & recomendados. Seleccione con la tecla en el valor 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); 

Segundo. USO LAST_INSERT_ID en el valor INSERT:

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

Tercera. USO DE SCRIPT PHP

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

Hay un error en su sintaxis del método 1.

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

debería ser

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

1) El sentido de foreign_key es asociar un valor en un campo con un valor pre_existente en otro lugar. Entonces debes hacer tus insertos en un orden lógico.

2) Si se quiere evitar restricciones lógicas que debe

SET foreign_key_checks = 0 // disable key checks in server 
INSERT ... // any order 
INSERT ... 
... 
SET foreign_key_checks = 1 
Cuestiones relacionadas