Table の削除, Table 内の Record の全削除 / TypeScript エンジニアのための PostgresDB
Tweet新しく学習時には大体、一回全部リセットしたい!!!というケースが頻繁に起きますよね。そもそもなんで動かなくなったかわからない。細かい修正をしようにも、どうすればいいかわからない。検索しても書いてあることがわからない。
こういう時には、完全に削除すればいいのです笑 まだ公開していないサービスであれば!
ということで今回は「削除系」の SQL を紹介します。
Table そのものを完全に削除したい
create table test_table
(
name text
);
drop table test_table;
テーブルを削除するのは簡単です。ただこれをすると、当然ですが内部に保持していた Record も全て削除します。基本的に復元する方法はありません。
たまに削除できないケースがある
たまにエラーが出て削除できないケースがあります。その一つのケースは、FK = foreign key を用いている場合です。
以下のように、Article が、それを書いた UserId を保持している構造だとしましょう。こういう場合、userId = 0
の User
を削除してしまうと、それに紐づいている 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 を全て削除する方法をみていきましょう。
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
を説明します。
-- name が 'name1' のものだけ削除する
delete
from test_table
where test_table.name = 'name1';
ようは if 文のようなものです。ある条件に合致したものだけを対象とする。それが where
の役割です。
where
の後ろに true
を置けば、当然ですが全ての row が対象になります。=
とか !=
といった比較演算子を置けば、その演算子が返す boolean が true の時だけ、delete の対象になるというわけです。
この勢いで PostgresDB をマスターだ!
初めての「削除」お疲れ様でした!1日一つ学習する日々を、100日継続したら100個できるようになるので、継続しさえすればマスターしたも同然です!
がんばっていきましょう!