PostgreSQL: clé étrangère / ON DELETE CASCADE

j'ai deux tables comme ici:

DROP   TABLE  IF EXISTS schemas.book;
DROP   TABLE  IF EXISTS schemas.category;
DROP   SCHEMA IF EXISTS schemas;
CREATE SCHEMA schemas;

CREATE TABLE schemas.category (
  id          BIGSERIAL PRIMARY KEY,
  name        VARCHAR   NOT NULL,
  UNIQUE(name)
);

CREATE TABLE schemas.book (
  id          BIGSERIAL PRIMARY KEY,
  published   DATE      NOT NULL,
  category_id BIGINT    NOT NULL REFERENCES schemas.category ON DELETE CASCADE ON UPDATE CASCADE,
  author      VARCHAR   NOT NULL,
  name        VARCHAR   NOT NULL,
  UNIQUE(published, author, name),
  FOREIGN KEY(category_id) REFERENCES schemas.category (id)
);

donc la logique est simple, après que l'utilisateur supprime tous les livres de la catégorie x, x est supprimé des chats, j'ai essayé la méthode ci-dessus mais ne fonctionne pas, après que je nettoie le livre de table, la catégorie de table encore peuplée, qu'est-ce qui ne va pas?

16
demandé sur juk 2013-01-03 18:55:04

4 réponses

une touche étrangère avec suppression en cascade signifie que si un enregistrement dans la table mère est supprimé, alors les enregistrements correspondants dans la table enfant seront automatiquement supprimés. C'est ce qu'on appelle une suppression en cascade.

Vous dites d'une manière opposée, ce n'est pas que lorsque vous supprimez de table enfant les dossiers seront supprimés à partir de la table parente.

UPDATE 1:

sur Supprimer L'option CASCADE est de spécifier si vous voulez supprimer des lignes dans une table enfant lorsque correspondant les lignes sont supprimées dans la table parent. Si vous ne spécifiez pas la suppression en cascade, le comportement par défaut du serveur de base de données vous empêche de supprimer des données dans une table si d'autres tables s'y réfèrent.

si vous spécifiez cette option, plus tard lorsque vous supprimez une ligne dans la table parent, le serveur de base de données supprime également toutes les lignes associées à cette ligne (clés étrangères) dans une table enfant. Le principal avantage de la fonctionnalité cascade-deletes est qu'elle vous permet de réduire la quantité de Déclarations SQL vous devez effectuer des actions de suppression.

il s'agit donc de savoir ce qui se passera lorsque vous supprimez des lignes de la table Parent et non de la table child.

ainsi, dans votre cas, lorsque l'utilisateur supprime des entrées de la table CATs, les lignes seront supprimées de la table books. :)

j'Espère que cela vous aide :)

53
répondu Mari 2016-03-23 15:50:48

Extrait à partir de PostgreSQL documentation:

la restriction et la suppression en cascade sont les deux options les plus courantes. [...] CASCADE spécifie que lorsqu'une ligne référencée est supprimée, ligne(s) de référencement, il sera automatiquement supprimé.

cela signifie que si vous supprimez une catégorie-référencée par Livres – Le Livre de référence sera également supprimé par ON DELETE CASCADE.

Exemple:

CREATE SCHEMA shire;

CREATE TABLE shire.clans (
    id serial PRIMARY KEY,
    clan varchar
);

CREATE TABLE shire.hobbits (
    id serial PRIMARY KEY,
    hobbit varchar,
    clan_id integer REFERENCES shire.clans (id) ON DELETE CASCADE
);

DELETE FROM clans vont s' CASCADE à hobbits par REFERENCES.

sauron@mordor> psql
sauron=# SELECT * FROM shire.clans;
 id |    clan    
----+------------
  1 | Baggins
  2 | Gamgi
(2 rows)

sauron=# SELECT * FROM shire.hobbits;
 id |  hobbit  | clan_id 
----+----------+---------
  1 | Bilbo    |       1
  2 | Frodo    |       1
  3 | Samwise  |       2
(3 rows)

sauron=# DELETE FROM shire.clans WHERE id = 1 RETURNING *;
 id |  clan   
----+---------
  1 | Baggins
(1 row)

DELETE 1
sauron=# SELECT * FROM shire.hobbits;
 id |  hobbit  | clan_id 
----+----------+---------
  3 | Samwise  |       2
(1 row)

si vous avez vraiment besoin du contraire (vérifié par la base de données), vous devrez écrire un trigger!

9
répondu Martin 2017-05-18 08:02:22

dans mon humble expérience avec postgres 9.6, suppression de cascade ne fonctionne pas dans la pratique pour les tables qui grandissent au-dessus d'une taille triviale.

  • pire encore, alors que la cascade de suppression se poursuit, les tables impliquées sont verrouillées de sorte que ces tables (et potentiellement votre base de données entière) est inutilisable.
  • pire Encore, il est difficile d'obtenir postgres pour vous dire ce que ça se passe pendant la cascade de suppression. Si c'est de prendre beaucoup de temps, quelle table ou quelles tables le rend lent? Peut-être c'est quelque part dans les informations de pg_stats? C'est difficile à dire.
1
répondu Gordon Vidaver 2018-02-07 18:42:41

clé de forge PostgreSQL supprimer, mettre à jour CASCADE

CREATE TABLE apps_user(
  user_id SERIAL PRIMARY KEY,
  username character varying(30),
  userpass character varying(50),
  created_on DATE
);

CREATE TABLE apps_profile(
    pro_id SERIAL PRIMARY KEY,
    user_id INT4 REFERENCES apps_user(user_id) ON DELETE CASCADE ON UPDATE CASCADE,
    firstname VARCHAR(30),
    lastname VARCHAR(50),
    email VARCHAR UNIQUE,
    dob DATE
);
-5
répondu Ram Pukar 2017-07-15 10:50:11