新しく学習時には大体、一回全部リセットしたい!!!というケースが頻繁に起きますよね。そもそもなんで動かなくなったかわからない。細かい修正をしようにも、どうすればいいかわからない。検索しても書いてあることがわからない。

こういう時には、完全に削除すればいいのです笑 まだ公開していないサービスであれば!

ということで今回は「削除系」の SQL を紹介します。

Table そのものを完全に削除したい

作って壊す
create table test_table
(
    name text
);

drop table test_table;

テーブルを削除するのは簡単です。ただこれをすると、当然ですが内部に保持していた Record も全て削除します。基本的に復元する方法はありません。

たまに削除できないケースがある

たまにエラーが出て削除できないケースがあります。その一つのケースは、FK = foreign key を用いている場合です。

以下のように、Article が、それを書いた UserId を保持している構造だとしましょう。こういう場合、userId = 0User を削除してしまうと、それに紐づいている Article は参照している User がいなくなってしまいます。

削除できないケース
type User = {
  id: number;
  name: string;
};

type Article = {
  id: number;
  userId: number;
  title: string;
};

type Users = {
  id: number;
  name: string;
  articles: Article[];
}[];

const users: Users = [
  {
    id: 0,
    name: "nakanishi",
    articles: [
      {
        id: 0,
        title: "react",
        userId: 0,
      },
      {
        id: 1,
        title: "css",
        userId: 0,
      },
    ],
  },
];

そうなってしまうのが RDB の設計的によくないことなので、そうさせないために FK = foreign key を使って構造を定義するという手法があります。これを使っている場合には、User テーブルを先に削除することができません。(Hasura で FK を指定して Relationships を作成していると必ずそうなりますね)

ではどうするかというと、先に Article テーブルを削除すればいいのです。そうすれば User を参照するテーブルが存在しなくなるので User テーブルを削除することが可能になります。

Table 内の Record を全て削除する

次に Table はそのままに、保持している Record を全て削除する方法をみていきましょう。

Recordを全削除
create table test_table
(
    name text
);

insert into test_table(name)
values ('name1'),
       ('name2'),
       ('name3');

-- 削除
delete
from test_table
where true;

ポイントは where true と付け加える点です。これは次の項目で説明しますが、ひたらくいえば「どんな record も条件的に対象とする」ということをやっているので、全部消えます。簡単ですね。

特定の Record を削除する

もう少し where を説明します。

特定の条件に一致したRecordを削除する
-- name が 'name1' のものだけ削除する
delete
from test_table
where test_table.name = 'name1';

ようは if 文のようなものです。ある条件に合致したものだけを対象とする。それが where の役割です。

where の後ろに true を置けば、当然ですが全ての row が対象になります。= とか != といった比較演算子を置けば、その演算子が返す boolean が true の時だけ、delete の対象になるというわけです。

この勢いで PostgresDB をマスターだ!

初めての「削除」お疲れ様でした!1日一つ学習する日々を、100日継続したら100個できるようになるので、継続しさえすればマスターしたも同然です!

がんばっていきましょう!