2010-08-26 19 views
1

Est-il possible d'insérer une ligne dans plusieurs tables à la fois? Si vous faites plusieurs tables liées par un ID; Quelle est la meilleure façon de garantir l'intégrité en cas de défaillance d'un INSERT?MySQL Multi-Insert? L'intégrité de la base de données MySQL après échec a INSÉRER

+1

"Insérer une ligne dans plusieurs tables à la fois" ressemble à une mauvaise conception de base de données. Insérez les valeurs dans une table, saisissez l'ID de cette ligne (clé primaire) et mettez à jour les autres tables avec la valeur d'ID en conséquence. – Chris

+0

alors je devrais mettre plus de 200 champs et plus de 1 million d'entrées dans la même table? – KeatsKelleher

Répondre

4

C'est exactement pour cela que sont transactions. Si l'une des commandes échouent, la chose depuis START TRANSACTION est annulée:

START TRANSACTION; 
INSERT INTO sometable VALUES(NULL,'foo','bar'); 
INSERT INTO someothertable VALUES (LAST_INSERT_ID(),'baz'); 
COMMIT; 

Cela étant MySQL, vous ne pouvez pas utiliser des transactions avec des tables MyISAM (vous aurez besoin des tables à utiliser un moteur qui prend en charge cette , probablement InnoDB).

Ce ne sera jamais inséré dans la table (que vous auriez normalement avoir une certaine ramification, par exemple un IF):

START TRANSACTION; 
INSERT INTO sometable VALUES(NULL,'data','somemoredata'); 
ROLLBACK; 

caveat: commandes SQL qui modifient la base de données la structure (par exemple CREATE, ALTER, DROP) ne peut pas être annulée!

+1

Merci! Mes tables sont MyISAM; Je vais convertir avec >> ALTER TABLE mytable ENGINE = InnoDB; – KeatsKelleher

1

Utiliser les transactions, luke.

+0

MySQL n'a pas toujours de transactions, en fonction du type de moteur. – coffeepac

0

MySQL insert multiple rows (recherche de « plusieurs lignes ») comme celui-ci:

INSERT INTO table (field1, field2, ...) VALUES (value1, value2), (value3, value4), etc... 

Cependant, il n'y a aucun moyen de dire ce qui a inséré et ce qui n'a pas été due à la contrainte des violations, au-delà de la requête renvoyant un nombre d'enregistrements, de doublons et d'avertissements. Vous ne pouvez pas non plus utiliser last_insert_id() pour identifier les ID des nouvelles lignes, car cela renvoie uniquement l'ID LAST qui a été créé, et non un ensemble d'ID.

Si vous devez garantir l'intégrité, utilisez des instructions d'insertion de ligne unique et des transactions.