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

Je voudrais supprimer des lignes contenant une clé étrangère, mais lorsque j’essaie quelque chose comme ceci:

DELETE FROM osoby WHERE id_osoby='1' 

Je reçois cette déclaration:

ERREUR: mise à jour ou suppression sur la table “osoby” viole la contrainte de clé étrangère “kontakty_ibfk_1” sur la table “kontakty” DETAIL: Key (id_osoby) = (1) est toujours référencé depuis la table “kontakty”.

Comment puis-je supprimer ces lignes?

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

CASCADE spécifie que lorsqu’une ligne référencée est supprimée, les lignes qui la référencent doivent également être automatiquement supprimées.

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; 

Il ne faut pas recommander cela comme solution générale, mais pour une suppression unique de lignes dans une firebase database qui n’est pas en production ou en cours d’utilisation, 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 deux tables qui se réfèrent via des clés étrangères. Ainsi, la suppression de 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 pouvoir append des clauses WHERE comme vous le souhaitez, bien entendu avec soin pour ne pas compromettre l’intégrité de la firebase database.

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

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

Powodzenia!

Cela fait un moment que cette question a été posée, l’espoir peut aider. Comme vous ne pouvez pas modifier ou modifier la structure de firebase database, 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 ] 

La description

TRUNCATE supprime rapidement toutes les lignes d’un ensemble de tables. Il a le même effet qu’un DELETE non qualifié sur chaque table, mais comme il n’parsing pas réellement les tables, il est plus rapide. En outre, il récupère immédiatement l’espace disque, au lieu d’exiger une opération VACUUM ultérieure. Ceci est particulièrement utile sur les grandes tables.


Tronquer la table othertable et basculer en cascade sur les tables faisant référence à othertable via des contraintes de clé étrangère:

 TRUNCATE othertable CASCADE; 

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

 TRUNCATE bigtable, fattable RESTART IDENTITY; 

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

 TRUNCATE revinfo RESTART IDENTITY CASCADE ;