7
votes

Supprimer des lignes de deux tables dans une requête

J'ai deux tables: commandes et ordres_Items. Les deux partageant la commande de terrain.

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?


2 commentaires

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.


6 Réponses :


1
votes

Pourriez-vous utiliser une fonction stockée et appelez cela?

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.


1 commentaires

Les procédures stockées me sont insaisissables. Le pas comme moi :-(



8
votes

Vous pouvez définir la table avec sur la cascade de suppression forte>. Si vous faites cela, il vous suffit de supprimer uniquement sur la table de commande. Les entrées d'autres tables à l'aide de order_id_id_id_id_id_fr comme une clé étrangère avec cette option activée seront supprimées automatiquement.

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;


2 commentaires

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



10
votes

Vous pouvez sûrement faire cela: xxx pré>

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


1 commentaires

# 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



3
votes

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 avec sur l'option DELETE CASCADE , puis de la table des parents supprimera automatiquement les lignes correspondantes des tables dépendantes.


1 commentaires

Je voulais juste écrire la même chose :) cascade est la chose la plus facile à faire.



2
votes

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;


0 commentaires

2
votes

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> xxx pré>

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;


0 commentaires