SQL Server 外部キー 非主キー リレーションシップ データベース

2024-04-10

SQL Serverにおける外部キーと非主キーの関係

SQL Serverでは、外部キーを使用して、異なるテーブル間の関連性を定義することができます。外部キーは、子テーブルの列を、親テーブルの列に関連付けるものです。通常、外部キーは親テーブルの主キーと関連付けられますが、非主キーと関連付けることも可能です。

非主キーと外部キー

非主キーとは、テーブル内の一意性を保証しない列です。一方、外部キーは、子テーブルの列を親テーブルの列に関連付けるためのものです。外部キーは、親テーブルの主キーまたは一意キーと関連付けることができます。

非主キーと外部キーを使用する利点

  • データの整合性を保つことができます。

親テーブルCustomers

  • CustomerID (主キー)
  • CustomerName

子テーブルOrders

  • OrderDate

この例では、OrdersテーブルのCustomerID列は、CustomersテーブルのCustomerID列に関連付けられています。つまり、Ordersテーブルに存在するCustomerIDは、Customersテーブルに存在するCustomerIDと一致する必要があります。

  • 外部キー列は、親テーブルの列と同じデータ型である必要があります。
  • 外部キー列は、NULL値を許可できない場合があります。
  • 親テーブルの列が変更された場合は、子テーブルの外部キーも更新する必要があります。



-- テーブルの作成

CREATE TABLE Customers (
    CustomerID int PRIMARY KEY,
    CustomerName varchar(50)
);

CREATE TABLE Orders (
    OrderID int PRIMARY KEY,
    CustomerID int FOREIGN KEY REFERENCES Customers(CustomerID),
    OrderDate datetime
);

-- データの挿入

INSERT INTO Customers (CustomerID, CustomerName)
VALUES (1, 'John Doe'),
       (2, 'Jane Doe');

INSERT INTO Orders (OrderID, CustomerID, OrderDate)
VALUES (1, 1, '2023-01-01'),
       (2, 2, '2023-02-01');

-- データの参照

SELECT *
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

このコードを実行すると、以下の結果が表示されます。

OrderID CustomerID OrderDate
------- -------- --------
1       1       2023-01-01
2       2       2023-02-01



非主キーと外部キーを関連付ける他の方法

一意キーとの関連付け

外部キーは、親テーブルの一意キーと関連付けることもできます。一意キーとは、テーブル内の一意性を保証する列です。

-- テーブルの作成

CREATE TABLE Customers (
    CustomerID int PRIMARY KEY,
    CustomerName varchar(50)
);

CREATE TABLE Orders (
    OrderID int PRIMARY KEY,
    CustomerID int FOREIGN KEY REFERENCES Customers(CustomerID),
    OrderDate datetime
);

-- データの挿入

INSERT INTO Customers (CustomerID, CustomerName)
VALUES (1, 'John Doe'),
       (2, 'Jane Doe');

INSERT INTO Orders (OrderID, CustomerID, OrderDate)
VALUES (1, 1, '2023-01-01'),
       (2, 2, '2023-02-01');

-- データの参照

SELECT *
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

外部キー制約を作成する際に、ON UPDATEおよびON DELETEオプションを使用して、親テーブルのレコードが更新または削除されたときの動作を指定することができます。

オプション

  • ON UPDATE CASCADE:親テーブルのレコードが更新された場合、子テーブルの関連するレコードも自動的に更新されます。
-- テーブルの作成

CREATE TABLE Customers (
    CustomerID int PRIMARY KEY,
    CustomerName varchar(50)
);

CREATE TABLE Orders (
    OrderID int PRIMARY KEY,
    CustomerID int FOREIGN KEY REFERENCES Customers(CustomerID)
    ON UPDATE CASCADE
    ON DELETE CASCADE,
    OrderDate datetime
);

この例では、OrdersテーブルのCustomerID列は、CustomersテーブルのCustomerID列に関連付けられています。ON UPDATE CASCADEオプションが指定されているため、Customersテーブルのレコードが更新された場合、Ordersテーブルの関連するレコードも自動的に更新されます。

CHECK 制約を使用して、外部キー列の値が親テーブルの列の値に存在することを確認することができます。

-- テーブルの作成

CREATE TABLE Customers (
    CustomerID int PRIMARY KEY,
    CustomerName varchar(50)
);

CREATE TABLE Orders (
    OrderID int PRIMARY KEY,
    CustomerID int,
    OrderDate datetime,
    CHECK (CustomerID IN (SELECT CustomerID FROM Customers))
);

非主キーと外部キーを関連付ける方法はいくつかあります。どの方法を使用するかは、データの構造と要件によって異なります。


sql sql-server


ソフトデリートとは? データベースからデータを安全に削除する方法

ソフトデリートには、以下のような利点があります。誤削除の防止: 誤ってデータを削除してしまった場合でも、ソフトデリートであれば復元することができます。データの監査: 削除されたデータも含めて、すべてのデータ履歴を保持することができます。論理的な整合性の維持: データの参照整合性を維持することができます。...


次世代データベースの活用例:Webアプリケーション、IoT、リアルタイム分析など

従来のデータベースは、主にリレーショナルデータベース(SQL)とNoSQLに分類されます。SQLデータベースは、構造化されたデータを効率的に管理するのに優れていますが、柔軟性に欠けるという課題があります。スキーマ変更が難しいため、データ構造の変化に対応しにくいという問題があります。...


SQL Server Profiler で "exec sp_reset_connection" の意味とは?

概要SQL Server Profiler で "exec sp_reset_connection" というイベントが記録された場合、これは 接続プール が使用されていることを示します。 接続プールは、データベースへの接続を再利用することで、パフォーマンスとスケーラビリティを向上させる仕組みです。...


PostgreSQLデータベース8.1のすべてのシーケンスをSQLで一覧表示する方法

\d+コマンドを使用するこれは最も簡単な方法です。psqlコマンドラインツールでデータベースに接続し、以下のコマンドを実行します。このコマンドは、現在のデータベース内のすべてのシーケンスの名前、所有者、現在の値、最大値、最小値、インクリメント値などの情報を表示します。...


【初心者でも安心】Oracleデータベースのシーケンス操作:ステップバイステップ解説

方法1:データディクショナリビューを使用するOracleデータベースには、すべてのデータベースオブジェクトに関する情報を格納するデータディクショナリと呼ばれるリポジトリがあります。このデータディクショナリには、シーケンスに関する情報も含まれており、専用のビューを使用してアクセスできます。...


SQL SQL SQL SQL Amazon で見る



【トラブル解決】MySQLで外部キーと非ユニークインデックスを使う際のエラーとその解決方法

MySQLでは、外部キーはユニークインデックスだけでなく非ユニークインデックスも参照できます。ただし、いくつかの制限事項と注意事項があります。概要データベースにおける外部キーは、異なるテーブル間の関連性を定義する制約です。外部キーは、あるテーブルの列(子キー)を、別のテーブルの列(親キー)と関連付けます。