Supprimer des lignes avec une clé étrangère dans PostgreSQL

Je voudrais supprimer les lignes qui contiennent une clé étrangère, mais quand j'essaie quelque chose comme ceci:

DELETE FROM osoby WHERE id_osoby='1'

Je reçois cette Déclaration:

Erreur: mettre à jour ou supprimer sur la table "osoby" viole la contrainte de clé étrangère "kontakty_ibfk_1" sur la table " kontakty" Détail: Key (id_osoby) = (1) est toujours référencé à partir de la table "kontakty".

Comment puis-je supprimer ces lignes?

43
demandé sur Mon Calamari 2013-01-06 16:27:34

5 réponses

Pour automatiser cela, vous pouvez définir une contrainte de clé étrangère avec ON DELETE CASCADE.
Je cite le , le manuel des contraintes de clé étrangère:

CASCADE spécifie que lorsqu'une ligne référencée est supprimée,) le référencement devrait également être automatiquement supprimé.

48
répondu Erwin Brandstetter 2013-01-06 12:55:45

Vous ne pouvez pas supprimer une clé étrangère si elle fait toujours référence à une autre table. Tout d'abord supprimer la référence

delete from kontakty
where id_osoby = 1;

DELETE FROM osoby 
WHERE id_osoby = 1;
27
répondu juergen d 2016-07-14 16:22:54

Il ne faut pas recommander cela comme une solution générale, mais pour la suppression ponctuelle de lignes dans une base de données qui n'est pas en production ou en utilisation active, vous pouvez désactiver temporairement les déclencheurs sur les tables en question.

Dans mon cas, je suis en mode développement et j'ai quelques tables qui se référencent via des clés étrangères. Ainsi, supprimer leur contenu n'est pas aussi simple que de supprimer toutes les lignes d'une table avant l'autre. Donc, pour moi, cela a bien fonctionné pour supprimer leur contenu comme suit:

ALTER TABLE table1 DISABLE TRIGGER ALL;
ALTER TABLE table2 DISABLE TRIGGER ALL;
DELETE FROM table1;
DELETE FROM table2;
ALTER TABLE table1 ENABLE TRIGGER ALL;
ALTER TABLE table2 ENABLE TRIGGER ALL;

Vous devriez être en mesure D'ajouter des clauses WHERE comme vous le souhaitez, bien sûr avec soin pour éviter de porter atteinte à l'intégrité de la base de données.

Il y a une bonne discussion liée à http://www.openscope.net/2012/08/23/subverting-foreign-key-constraints-in-postgres-or-mysql/

15
répondu Andrew Basile 2016-03-09 01:40:11

Cela signifie que dans le tableau kontakty vous avez une ligne qui référence la ligne dans osoby que vous souhaitez supprimer. Vous devez d'abord supprimer cette ligne ou définir une suppression en cascade sur la relation entre les tables.

Powodzenia!

6
répondu zibi 2013-01-06 12:30:31

Cela fait un moment que cette question n'a pas été posée, l'espoir peut aider. Parce que vous ne pouvez pas modifier ou modifier la structure de la base de données, vous pouvez le faire. selon les documents postgresql .

TRUNCATE -- vide une table ou un ensemble de tables.

TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ]
    [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]

Description

TRUNCATE supprime rapidement toutes les lignes d'un ensemble de tables. Il a le même effet qu'une suppression non qualifiée sur chaque table, mais comme il n'analyse pas réellement les tables, il est plus rapide. En outre, il récupère l'espace disque immédiatement, plutôt que d'exiger une opération de vide ultérieure. Ceci est très utile sur les grandes tables.


Tronque la table othertable, et cascade à toutes les tables qui font référence à othertable via des contraintes de clé étrangère:

TRUNCATE othertable CASCADE;

La même chose, et également réinitialiser les générateurs de séquence associés:

TRUNCATE bigtable, fattable RESTART IDENTITY;

Tronquer et réinitialiser les générateurs de séquences associés:

TRUNCATE revinfo RESTART IDENTITY CASCADE ;
4
répondu OJVM 2016-10-19 20:23:13