主キー、外部キー、制約
面接官が求める形で、キー、一意性、参照整合性について説明します。
「主キー、外部キー、制約」はCoddyKit上の無料Coding Interview Prepレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCoding Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Coding Interview Prepコースには全4レッスンが含まれています。
キーが必ず話題になる理由
SQLの定義を説明した後、面接官はキーと制約に話題を移します。これらを結び付けるテーマは整合性です。つまり、不正なデータが入り込まないようにデータベースが適用するルールです。
主キーとは何か
主キーは各行を一意に識別します。必ず一意でNOT NULLであり、1つのテーブルに最大1つだけ設定できます。この点を簡潔に答えられると評価につながります。
CREATE TABLE customers (
id INTEGER PRIMARY KEY,
email VARCHAR(255) NOT NULL,
name VARCHAR(100)
);自然キーと代理キー
実際のデータを使うのでしょうか、それとも生成した番号を使うのでしょうか。自然キーは既存の一意なデータを使い、代理キーは生成したIDを使います。多くのチームが代理キーを好むのは、値が安定しているからです。
複合主キー
主キーは複数の列にまたがる複合キーにすることもできます。これは中間テーブルでよく使われ、2つの外部キーを組み合わせて各行を識別します。
CREATE TABLE enrollments (
student_id INTEGER,
course_id INTEGER,
enrolled_on DATE,
PRIMARY KEY (student_id, course_id)
);主キーと一意制約
必ず聞かれる質問の1つが、主キーと一意制約の違いです。どちらも一意性を保証しますが、1つのテーブルに設定できる主キーは1つで、NOT NULLです。一方、一意制約は複数設定でき、それぞれNULLを許容します。
CREATE TABLE users (
id INTEGER PRIMARY KEY,
email VARCHAR(255) UNIQUE,
username VARCHAR(50) UNIQUE
);外部キーとは何か
外部キーは別のテーブルの主キーを参照し、参照整合性を保証します。存在しない親を指す子の行を追加することはできません。
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
customer_id INTEGER REFERENCES customers(id),
amount NUMERIC(10,2)
);参照アクション:ON DELETE / ON UPDATE
「顧客が削除されたら、その顧客の注文はどうなりますか?」これは参照アクションに関する質問です。RESTRICTは削除を拒否し(デフォルト)、CASCADEは子の行を削除し、SET NULLはキーをNULLにします。
CREATE TABLE order_items (
id INTEGER PRIMARY KEY,
order_id INTEGER REFERENCES orders(id) ON DELETE CASCADE
);NOT NULL、CHECK、DEFAULT
整合性を支える制約は、ほかにも3つあります。NOT NULLは値の欠落を禁止し、CHECKはstock >= 0のようなルールを適用し、DEFAULTは代替となる値を設定します。
CREATE TABLE products (
id INTEGER PRIMARY KEY,
price NUMERIC(10,2) NOT NULL DEFAULT 0,
stock INTEGER CHECK (stock >= 0)
);例題:整合性を考慮して設計する
図書館の貸出テーブルを設計してみましょう。以下のコードでは、2つの外部キー、NULLを許可しない返却期限、そして1冊の本を同時に2回貸し出せないようにする一意制約を使います。
CREATE TABLE loans (
id INTEGER PRIMARY KEY,
book_id INTEGER NOT NULL REFERENCES books(id),
member_id INTEGER NOT NULL REFERENCES members(id),
due_date DATE NOT NULL,
returned BOOLEAN DEFAULT false
);整合性について説明する方法
理解の深さを示すには、3種類の整合性を挙げましょう。主キーによるエンティティ整合性、外部キーによる参照整合性、そしてNOT NULL、CHECK、データ型によるドメイン整合性です。
既存のテーブルに制約を追加する
既存のテーブルに制約を追加するよう求められたら、ALTER TABLE ... ADD CONSTRAINTを使います。注意すべき点として、現在の行が新しいルールにすでに違反している場合は失敗することがあります。
ALTER TABLE orders
ADD CONSTRAINT fk_orders_customer
FOREIGN KEY (customer_id) REFERENCES customers(id);理解度チェック
主キーと一意制約の違いを説明してみましょう。
まとめ
まとめ:主キーは一意かつNOT NULLで、1つのテーブルに1つだけ設定できます。一意制約はNULLを許容し、複数設定できます。外部キーは参照整合性を保証します。
よくある質問
「主キー、外部キー、制約」レッスンは無料ですか?
はい。「主キー、外部キー、制約」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Coding Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Coding Interview Prepコースには全4レッスンが含まれています。
「主キー、外部キー、制約」で何を学びますか?
面接官が求める形で、キー、一意性、参照整合性について説明します。 ブラウザで直接実行するハンズオンコードでCoding Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Coding Interview Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCoding Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「主キー、外部キー、制約」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCoding Interview Prepレッスンでコードを書いて実行できますか?
はい。すべてのCoding Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。