【Amazon.co.jp限定】USBメモリ 1TB 大容量 USB3.0・Type-C 高速データ転送 メモリー フラッシュメモリ 外付け 容量不足解消 スマホ用可能 Mac Windows PC Pad対応 360度回転 合金製 耐衝撃 防塵仕様 バックアップ タイプC USBメモリー 携帯便利 コンパクト
¥2,999 (2025年4月29日 13:06 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)
Supabaseから複数の関連テーブルからデータを取得しようとした際につまりました。
以下の3つのテーブルを定義していました。
下記の手順でデータを取得したかったです。
- usersテーブルのuser_idを元に、user_skillテーブルのuser_idを参照
- user_skillテーブルのskill_idを元に、skillsテーブルのidを参照
- skillsテーブルのnameを取得
user_id: varchar | name: varchar | description: text | a_id: varchar | b_id: varchar | c_id: varchar | created_at: timestamptz |
---|---|---|---|---|---|---|
sample-id | なまえ | aのid | bのid | cのid | 2025-XX-XX |
id: int8 | user_id: varchar | skill_id: int8 | created_at: timestamptz |
---|---|---|---|
1 | sample-id | 1 | 2025-XX-XX |
id: int8 | name: varchar | created_at: timestamptz |
---|---|---|
1 | React | 2025-XX-XX |
2 | TypeScript | 2025-XX-XX |
3 | GitHub | 2025-XX-XX |
user_skillテーブルに外部キーを設定する
- user_skillテーブルの
user_id
を外部キーとして設定
(参照先はusersテーブルの主キー:user_id
) - user_skillテーブルの
skill_id
を外部キーとして設定
(参照先はskillsテーブルの主キー:id
)
外部キーとは
あるテーブルのカラム(列)が別のテーブルの主キー
を参照すること
なぜ外部キーの設定が必要?
外部整合制約のメリットをもらうため
データの整合性保持
skillsテーブルのid=1のレコードを削除した場合、user_skillテーブルのskill_id=1はどこも参照できず、ただのデータになってしまいます。
誤削除の防止
外部キーの設定を行うことで、意図せずレコードを削除してしまうことを防ぐことができます。
試しに、skill_id=1を消そうとすると、エラーとなり削除を防ぐことができました。
Supabaseのdashbordから外部キーを設定する
- user_skillテーブルのuser_idをクリック、
Edit column
を選択
2. Add foreign key
を押下
3. 参照するテーブルを選択(今回はusersテーブル
)
4. 参照するカラムを選択(今回はuser_idカラム
)選択後、Save
を押下
リレーションで取得するように修正
Supabaseでは外部キーの関係を自動的に検出して、簡単にデータを取得できます
- 公式ドキュメントより引用
The data APIs automatically detect relationships between Postgres tables. Since Postgres is a relational database, this is a very common scenario.
(日本語訳)
データAPIは自動的にPostgresテーブル間の関係を検出します。Postgresはリレーショナルデータベースなので、これは非常に一般的なシナリオです。
const { data, error } = await supabase
.from("users")
.select("*, user_skill(skills(name))")
.eq("user_id", id);
-
from("users")
: usersテーブルから取得する -
.select("*
:*
でusersテーブルの全てのカラムを取得する -
user_skill()
: usersのuser_idと紐づくものを取得 -
skills(name)
:user_skillと紐づくidからskillsテーブルのidと紐づくものを取得
以下のSQLと同じことをしています。
SELECT
users.*,
skills.name
FROM
users
LEFT JOIN
user_skill ON users.id = user_skill.user_id
LEFT JOIN
skills ON user_skill.skill_id = skills.id
WHERE
users.user_id = [id値]
外部キーをなぜ指定しないといけないのかわかっていない状態でした。
SQLの学習も進めていきたいです。
Views: 1