主キー、外部キー、およびデータベース内の null と not null の意味をしっかりと把握しているとは思いません。または、少なくとも、そうする場合、何をしようとしているのかを説明するために正しい構文を使用していません。
ほとんどの列定義には、名前、長さ (場合によっては)、データ型、および NULL/NOT NULL、AUTOINCREMEMT、PRIMARY KEY などの修飾子が含まれます。さらに、すべての列定義の後、ほとんどのデータベースには定義する特定の構文構造があります。インデックス付き列、主キー、一意の列などの制約。主キー列は、列定義で上で定義された列である必要があることに注意してください。
各データベースの構文にはニュアンスがありますが、ほとんどのデータベースは一貫したパターンに従っています。たとえば、MySQL では、次のようにいくつかのテーブルを定義できます。
CREATE TABLE profiles (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(50) NOT NULL,
-- other fields
);
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
profile_id INTEGER NOT NULL,
first_name VARCHAR(30) NOT NULL,
last_name VARCHAR(30) NOT NULL,
date_of_birth DATETIME NOT NULL,
nationality VARCHAR(30) NOT NULL,
gender CHAR(1) NOT NULL,
address VARCHAR(30) NOT NULL,
CONSTRAINT FOREIGN KEY (profile_id)
REFERENCES profiles (id)
ON UPDATE CASCADE
ON DELETE CASCADE );
もちろん、使用する正確な構文は、何をしようとしているのかによって完全に異なります。上記の例では、プロファイルとユーザーの 2 つのテーブルが作成されます。users テーブルでは、id 列が主キーで、profile_id 列がプロファイル テーブルを参照する外部キーです。上記の列定義で外部キー (profile_id) がどのように定義されているかに注意してください。これは必須です。また、ほとんどすべてのデータベースで、PRIMARY KEY を列定義の修飾子として指定できます。オプションで、次のように制約として指定できます。
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
-- other columns and constraints...
PRIMARY KEY (id) );
代わりにその構文を使用する主な理由は、複数列の主キーがある場合です。2 つ以上の列は、それ自体は必ずしも一意ではありませんが、一緒にすると一意の組み合わせになります。しかし、それは少し進んでいます。
ほとんどのデータベースでは、主キー列に null 値を含めることはできません。たとえば、MySQL では、プライマリ キー カラムを明示的に NOT NULL として宣言しない場合、いずれにせよ暗黙のうちにそのようになります。主キー列を null 値を持つことができると宣言できた場合、null を持つことができるレコードは 1 つだけです。複数の null は主キーの制約に違反します。
外部キーは null にすることができますが、おそらく null にしたくないでしょう。これが外部キーの要点のようなものです。別のテーブルのデータへの参照として機能し、ほとんどの場合、外部キーを持つテーブル内のすべての行に別のテーブルの親データを含める必要があります。null 外部キーが必要になるのは、テーブルに「孤立した」データを含める場合だけです。上記の例では、ユーザーが自分のアカウントに添付されたプロファイルを持っていない可能性がある場合、profile_id 列は null である可能性があります。
主キーと外部キーに関する基本的なチュートリアル情報を探すことを強くお勧めします。これらは習得するのが難しい概念ではありませんが、データベースをかなりの程度まで扱う場合は、必ず知っておく必要があるものです。これが役に立てば幸いです。あなたがやろうとしていることを見つけてください。達成しようとしている具体的なタスクがある場合は、それが何であるかを投稿すると役立つ場合があります。これは、私が言ったことを具体的に適用できることを期待して概念的に説明するよりも、実際の例で作業する方が簡単だからです。しようとしています。