Postgresql supprimer plusieurs lignes à partir de plusieurs tables
Envisager de 2 ou plusieurs tables:
users (id, firstname, lastname)
orders (orderid, userid, orderdate, total)
Je souhaite supprimer tous les utilisateurs et leur commandes qui correspondent le prénom " Sam'. Dans mysql, j'ai l'habitude de faire une jointure gauche. Dans cet exemple, l'identifiant est inconnu de nous.
Quel est le bon format de la requête?
Vous devez vous connecter pour publier un commentaire.
http://www.postgresql.org/docs/current/static/sql-delete.html
Vous pouvez également créer la table avec
ON delete cascade
http://www.postgresql.org/docs/current/static/ddl-constraints.html
Organiser bon les suppressions en cascade est sage, et est généralement la bonne solution pour cela.
Pour certains cas spéciaux, il y a une autre solution à ce qui peut être pertinent.
Si vous avez besoin d'effectuer plusieurs supprime basés sur un ensemble commun de données, vous pouvez utiliser des expressions de table communes
Il est difficile de trouver un exemple simple comme le principal cas d'utilisation de ce peut être couvert par les suppressions en cascade.
Pour l'exemple, nous allons supprimer tous les éléments dans Une table dont la valeur est l'ensemble des valeurs que nous sommes la suppression de la table B. Habituellement, ce serait clés, mais où ils ne le sont pas, de suppression en cascade ne peut pas être utilisé.
Pour résoudre ce problème, vous utilisez des expressions de table communes
Cet exemple est volontairement simple, car de mon point n'est pas argumenter sur le mappage des touches, etc, mais à montrer comment deux ou plus des suppressions peuvent être effectués hors d'un dataset partagé.
Cela peut être beaucoup plus complexe aussi, y compris les commandes de mise à jour etc.
Voici un exemple plus complexe (à partir de Darth Vader de la base de données personnelles). Dans ce cas, nous avons un tableau qui fait référence à une table d'adresses. Nous avons besoin de supprimer des adresses à partir de l'adresse de la table si ils sont dans sa liste de planètes, il est détruit. Nous voulons utiliser cette information de façon à supprimer les gens de la table, mais seulement s'ils étaient sur la planète (ou sur son trophée-kill list)
Maintenant sa base de données est à jour. Pas d'intégrité les défaillances dues à l'Adresse de suppression.
Note que bien que nous renvoi de données à partir de la mise à jour et la première supprimer, cela ne signifie pas que nous devons l'utiliser. Je ne suis pas certain de savoir si vous pouvez mettre une suppression dans un CTE avec pas renvoyé de données (My SQL peut également être tort sur l'utilisation du retour d'une mise à jour - je n'ai pas pu tester l'exécution de ce que Darth V. était dans une mauvaise humeur humeur.
Définir
userid
comme une clé étrangère àusers (id)
avec suppression en cascade, par exemple: