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
Répondre
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!
Merci! Mes tables sont MyISAM; Je vais convertir avec >> ALTER TABLE mytable ENGINE = InnoDB; – KeatsKelleher
Utiliser les transactions, luke.
MySQL n'a pas toujours de transactions, en fonction du type de moteur. – coffeepac
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.
"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
alors je devrais mettre plus de 200 champs et plus de 1 million d'entrées dans la même table? – KeatsKelleher