1. ホーム
  2. sql

[解決済み] PostgreSQLの場合。外部キー/削除時のカスケード

2022-03-06 03:48:18

質問

このような2つのテーブルがあります。

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)
);

ロジックは単純で、ユーザーがカテゴリxの下の本をすべて削除した後、xは猫から削除されます。私は上記の方法を試してみましたが、うまくいきません。

解決方法は?

カスケード削除のある外部キーとは、親テーブルのレコードが削除されると、子テーブルの対応するレコードも自動的に削除されることを意味します。これをカスケード削除といいます。

子テーブルから削除すると、親テーブルからも削除されるということではないのですね。

UPDATE 1:

on delete cascade オプションは、親テーブルで対応する行が削除されたときに子テーブルでも行を削除するかどうかを指定するものです。カスケード削除を指定しなかった場合、データベースサーバーのデフォルトの動作では、他のテーブルがそのテーブルを参照している場合は、そのテーブルのデータを削除することができません。

このオプションを指定すると、後で親テーブルの行を削除するときに、データベースサーバーは子テーブルのその行に関連するすべての行 (外部キー) も削除するようになります。カスケード削除の主な利点は、削除操作を実行するために必要な SQL 文の量を減らすことができることです。

つまり、子テーブルからではなく、親テーブルから行を削除した場合にどうなるかということです。

つまり、あなたのケースでは、ユーザーがCATsテーブルからエントリを削除すると、booksテーブルから行が削除されることになります。)

お役に立てれば幸いです :)