sql >> データベース >  >> RDS >> Sqlserver

SQLServer2017でリレーションシップを作成する

    SQLServerで2つのテーブル間に関係を作成する方法を学びます。

    リレーショナルデータベースの設計では、関係 2つ以上のテーブルに関連データが含まれているため、2つ以上のテーブルがリンクされている場所です。これにより、ユーザーは複数のテーブルにまたがる関連データのクエリを実行できます。

    チュートリアルのこの部分では、次の関係を作成する方法について説明します。

    その図には2つの関係があります。 Albumsの間には関係があります およびArtists テーブル、およびAlbumsの間には別の関係があります およびGenres テーブル。

    その図を見ると、1人のアーティストが多くのアルバムを持っている可能性があることがわかります。この場合、アルバムの数に関係なく、アーティストの名前を含む行が1つだけ必要です。これは、Artistsでレコードを作成できるためです。 一意のArtistIdを持つテーブル 。そのアーティストのすべてのアルバムは、Albumsに保存されます テーブルであり、それぞれのArtistIdに同じアーティストIDが含まれます。 桁。これにより、両方のテーブルでクエリを実行し、アーティストの名前と、リリースしたすべてのアルバムを返すことができます。これは関係の利点です。

    以前、上記の3つのテーブルを含むデータベースを作成しました。その際、上の図に示されている関係の1つも作成しました。 Albums間の関係を作成しました テーブルとArtists テーブル(ArtistId Albumsの列 テーブルはArtistsIdを参照します Artistsの列 表)。

    テーブルを作成するために実行したコードは次のとおりです。

    強調表示されたコードは、Albums間の関係を作成する部分です。 テーブルとArtists テーブル。これは、ArtistIdを設定することで行われます。 Albumsの列 ArtistIdを参照するには Artistsの列 テーブル。

    これをより技術的に言うと、Albums.ArtistId Artists.ArtistIdの外部キーになります (それ自体がそのテーブルの主キーです)。これは外部キー制約です。

    外部キー制約とは何ですか?

    外部キー制約 このテーブルと別のテーブルの間の関係を定義します。外部キー制約を作成するときは、の特定の列に対して外部キー制約を作成します。 テーブル、の特定の列を参照する テーブル。

    これにより、子テーブルのその列が外部キーになります。 。この制約により、この(外部キー)列に入るすべての値が、親テーブルの主キー列の値に対応することが保証されます。親テーブルの主キー列の値と一致しない値を入力しようとすると、SQLServerはエラーをスローします。

    これは、参照整合性を強化するのに役立ちます。これにより、孤立したレコード(親を持たない子レコード)を作成できなくなります。または、この例では、どのアーティストにも関連付けられていないアルバムです。

    SSMSやAzureDataStudioなどのGUIデータベース管理ツールを使用する場合、関係はKeysの下に表示されます。 外部キーを持つテーブルのノード:

    コードを分解してみましょう:

    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を参照する外部キーになります 。

    したがって、そのステートメントを実行すると、キーの下に新しい外部キーが表示されます。 ノード:

    単一列の外部キー

    単一列の外部キー(上記のような)も列レベルで指定できます。したがって、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)

    1. PostgreSQLユーザーに空白のパスワードを設定する

    2. SQL Serverで日付を切り捨てる最良の方法は何ですか?

    3. 致命的なエラー:[]演算子は文字列ではサポートされていません

    4. DEFAULT句にCURRENT_TIMESTAMPを持つTIMESTAMP列が1つしかないのはなぜですか?