J'ai deux tables: commandes et ordres_Items. Les deux partageant la commande de terrain. P>
Je veux supprimer toutes les lignes des deux tables où OrderID = 500, mais je dois le faire dans une seule requête. Est-ce possible? P>
6 Réponses :
Pourriez-vous utiliser une fonction stockée et appelez cela? P>
et ensuite à l'intérieur de votre fonction stockée, vous auriez les deux requêtes de suppression. Ensuite, lorsque la fonction stockée est appelée, elle fonctionnera en tant que transaction et vous pouvez le rendre tout ce que vous aimez. P>
Les procédures stockées me sont insaisissables. Le pas comme moi :-(
Vous pouvez définir la table avec Cet exemple est extrait de la MYSQL Manuel : P> CREATE TABLE parent(
id INT NOT NULL,
PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE child(
id INT, parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE
) ENGINE=INNODB;
Son ok. Je vais l'essayer. Et reviens.
Ça a marché comme sur des roulettes. Merci. Alter Table Commandes_Items Ajouter une clé étrangère (ORDID) Références Commandes (OrderId) sur Suppr Cascade
Vous pouvez sûrement faire cela: voir http://dev.mysql.com/doc/refman/5.0/fr/delete.html p> [modifier:] p> C'est le TRAITE TOUT: P> DELETE FROM `orders`, `orders_items`
USING `orders`
INNER JOIN `orders_items` ON `orders`.`orderId` = `orders_items`.`orderId`
WHERE `orders`.`orderId`= 500
# 1064 - Vous avez une erreur dans votre syntaxe SQL; Vérifiez le manuel qui correspond à votre version de Server MySQL pour la syntaxe droite à utiliser à proximité 'où OrderID = 500' à la ligne 1
Cela dépend de votre moteur de base de données, mais en gros, ce dont vous avez besoin de sons comme si vous souhaitez une table faisant référence à l'autre à l'aide d'une clé étrangère code> avec sur l'option DELETE CASCADE CODE>, puis de la table des parents supprimera automatiquement les lignes correspondantes des tables dépendantes. P>
Je voulais juste écrire la même chose :) cascade est la chose la plus facile à faire.
Voici une solution simplement si vous utilisez MySQL / PGSQL ...
DELETE t1, t2, t3 FROM table1 AS t1 LEFT JOIN table2 AS t2 USING( orderID ) LEFT JOIN table3 AS t3 USING( orderID ) WHERE t1.orderID = 500;
Si vous utilisez InnoDB (ou un moteur de stockage qui les prend en charge), vous pouvez utiliser Contraintes de clés étrangères pour supprimer les lignes de correction. C'est l'une des approches les plus faciles / les plus sûres si cela ne vous dérange pas de légère impact sur les performances des clés étrangères. Notez toutefois que les lignes supprimées en raison de contraintes ne sont pas des déclencheurs de tirer.
Alternativement, vous pouvez utiliser des déclencheurs. Ils travaillent avec n'importe quel moteur de stockage et ils sont généralement assez faciles à écrire. Je les aime mais ils ne sont pas très performants si vous supprimez un grand nombre de lignes à la fois (plusieurs centaines ou des milliers.) P> enfin, comme suggéré dans un Réponse précédente, vous pouvez utiliser Multi-Table Supprimer: P> DELETE o, oi
FROM orders o
LEFT JOIN orders_items oi USING (orderID)
WHERE o.orderID = 500;
Pourquoi auriez-vous besoin de le faire dans une requête? Selon la façon dont vous accédez à la base de données, vous pouvez utiliser deux déclarations séparées par le point-virgule et le traiter comme une. La seule autre manière que je connaisse est d'utiliser la procédure stockée.
Ouais je sais. Mais je dois le faire manuellement avec des milliers de rangées. L'idée est de le faire dans une seule requête pour essayer d'éviter les erreurs de basculement.