SQLServerで2つのテーブル間に関係を作成する方法を学びます。
リレーショナルデータベースの設計では、関係 2つ以上のテーブルに関連データが含まれているため、2つ以上のテーブルがリンクされている場所です。これにより、ユーザーは複数のテーブルにまたがる関連データのクエリを実行できます。
チュートリアルのこの部分では、次の関係を作成する方法について説明します。
![](http://www.sqldat.com/article/uploadfiles/202205/2022051111445453.gif)
その図には2つの関係があります。 Albums
の間には関係があります およびArtists
テーブル、およびAlbums
の間には別の関係があります およびGenres
テーブル。
その図を見ると、1人のアーティストが多くのアルバムを持っている可能性があることがわかります。この場合、アルバムの数に関係なく、アーティストの名前を含む行が1つだけ必要です。これは、Artists
でレコードを作成できるためです。 一意のArtistId
を持つテーブル 。そのアーティストのすべてのアルバムは、Albums
に保存されます テーブルであり、それぞれのArtistId
に同じアーティストIDが含まれます。 桁。これにより、両方のテーブルでクエリを実行し、アーティストの名前と、リリースしたすべてのアルバムを返すことができます。これは関係の利点です。
以前、上記の3つのテーブルを含むデータベースを作成しました。その際、上の図に示されている関係の1つも作成しました。 Albums
間の関係を作成しました テーブルとArtists
テーブル(ArtistId
Albums
の列 テーブルはArtistsId
を参照します Artists
の列 表)。
テーブルを作成するために実行したコードは次のとおりです。
![](http://www.sqldat.com/article/uploadfiles/202205/2022051111445469.gif)
強調表示されたコードは、Albums
間の関係を作成する部分です。 テーブルとArtists
テーブル。これは、ArtistId
を設定することで行われます。 Albums
の列 ArtistId
を参照するには Artists
の列 テーブル。
これをより技術的に言うと、Albums.ArtistId
Artists.ArtistId
の外部キーになります (それ自体がそのテーブルの主キーです)。これは外部キー制約です。
外部キー制約とは何ですか?
外部キー制約 このテーブルと別のテーブルの間の関係を定義します。外部キー制約を作成するときは、子の特定の列に対して外部キー制約を作成します。 テーブル、親の特定の列を参照する テーブル。
これにより、子テーブルのその列が外部キーになります。 。この制約により、この(外部キー)列に入るすべての値が、親テーブルの主キー列の値に対応することが保証されます。親テーブルの主キー列の値と一致しない値を入力しようとすると、SQLServerはエラーをスローします。
これは、参照整合性を強化するのに役立ちます。これにより、孤立したレコード(親を持たない子レコード)を作成できなくなります。または、この例では、どのアーティストにも関連付けられていないアルバムです。
SSMSやAzureDataStudioなどのGUIデータベース管理ツールを使用する場合、関係はKeys
の下に表示されます。 外部キーを持つテーブルのノード:
![](http://www.sqldat.com/article/uploadfiles/202205/2022051111445483.gif)
コードを分解してみましょう:
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId) REFERENCES dbo.Artists (ArtistId) ON DELETE NO ACTION ON UPDATE NO ACTION
最初の2行は関係を作成します。
Albums.ArtistId
間に外部キー制約を作成します 列と
Artists.ArtistId
桁。この場合、外部キー制約をFK_Albums_Artists
と呼びます。 。
最後の2行は、子テーブルのレコードによって参照されている親レコードを誰かが削除または更新しようとした場合にSQLServerが実行する処理を指定します。この場合、NO ACTION
削除/更新が先に進まないことを意味します。ユーザーにはエラーが表示されます。
これをON DELETE CASCADE
に変更できます 親と子を一度に削除できるようにしたい場合(つまり、削除は親から子にカスケードされます)。 ON UPDATE CASADE
を使用して、同じロジックを更新に適用します 。
NO ACTION
はデフォルト値であるため、最後の2行のコードがなくても実行できます。ただし、外部キー制約を作成するときに考慮することが重要な要素であるため、これを含めました。
既存のテーブルに関係を追加する
前の例では、テーブルの作成と同時にリレーションシップを作成します。ただし、既存のテーブルにリレーションシップを追加する必要がある場合があります。
Genres
の間に新しい関係を追加しましょう およびAlbums
テーブル。
次のコードを実行します:
USE Music; ALTER TABLE Albums ADD CONSTRAINT FK_Albums_Genres FOREIGN KEY (GenreId) REFERENCES dbo.Genres (GenreId) ON DELETE NO ACTION ON UPDATE NO ACTION ;
これにより、Albums
に新しい外部キーが作成されます テーブル。結果としてAlbums.GenreId
Genres.GenreId
を参照する外部キーになります 。
したがって、そのステートメントを実行すると、キーの下に新しい外部キーが表示されます。 ノード:
![](http://www.sqldat.com/article/uploadfiles/202205/2022051111445477.gif)
単一列の外部キー
単一列の外部キー(上記のような)も列レベルで指定できます。したがって、Albums
を作成する別の方法 テーブルとその外部キーは次のようになります:
CREATE TABLE Albums ( AlbumId int IDENTITY(1,1) NOT NULL PRIMARY KEY, AlbumName nvarchar(255) NOT NULL, ReleaseDate date NOT NULL, ArtistId int NOT NULL REFERENCES Artists(ArtistId), GenreId int NOT NULL );
このメソッドは複数列のキー制約には使用できないため、これらの場合は、上記の元の例の構文を使用してください。
複数列の外部キー
複数列の外部キーは、複数の列が外部キーに使用される場所です。これは通常、親テーブルが主キーに複数の列を使用する場合に使用されます。これは、親テーブルが2つの列の値を組み合わせて一意の値を作成する場合に当てはまる可能性があります。
複数列の外部キーは、上記の元の例の構文を使用して作成できます。各列名をコンマで区切って追加するだけです。
したがって、Albums
を想像すると テーブルにはArtistName
もあります 列(およびArtists
テーブルはArtistId
を使用します およびArtistName
主キーとして)、複数列の外部キーは次のようになります。
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId, ArtistName) REFERENCES dbo.Artists (ArtistId, ArtistName)