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

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

    SQLでは、外部キー制約を作成して関係を作成します。

    具体的には、親テーブルと子テーブルがあります。親には主キーが含まれ、子テーブルには親テーブルの主キーを参照する外部キーが含まれます。

    SQLを使用してリレーションシップを作成する場合、テーブルの作成時にリレーションシップを作成することも、後で(テーブルを変更して)作成することもできます。この記事では、両方のシナリオについて説明します。

    テーブルを作成するときに関係を作成する

    CREATE TABLE内にリレーションシップを作成する例を次に示します。 テーブルを作成するときのステートメント。

    CREATE TABLE Parent (
      ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
      ParentName nvarchar(255) NOT NULL
    )
    CREATE TABLE Child (
      ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
      ChildName nvarchar(255) NOT NULL,
      ParentId int NOT NULL
      CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)     
        REFERENCES Parent (ParentId)
    );

    ここで2つのテーブルを作成しました。 Parentと呼ばれるもの もう1つはChildと呼ばれます 。

    子のテーブル定義内にリレーションシップを作成しました。関係はCONSTRAINTで作成されます 口論。これはまだCREATE TABLE内にあることに注意してください ステートメント。

    関係には名前が必要です。この場合、私はそれをFK_Child_Parentと呼びました 。 FOREIGN KEY 一部の後には、外部キーとなる(子テーブル内の)列の名前が続きます。

    REFERENCES partは、外部キーが参照する列を指定します。この場合、ParentIdを参照します Parentの列 テーブル。これは、REFERENCES Parent (ParentId)を使用して行われます。 。

    関係を構築するために必要なのはこれだけです。

    このページの例はSQLServerを使用して行われたことに注意してください。 DBMSによっては、列定義の詳細を変更する必要がある場合があります。

    例:IDENTITY AUTO_INCREMENTと呼ばれることもあるSQLServerのバージョンです。 他のDBMS(MySQLなど)。 SQLiteを使用している場合は、SQLiteで自動インクリメント列を作成する方法は次のとおりです。

    既存のテーブルに関係を追加する

    ALTER TABLEを使用するだけで、既存のテーブルにリレーションシップを追加することもできます。 ステートメント。

    前の例の2つのテーブルを作成するときに、リレーションシップを作成しなかったとしましょう。代わりにこれを行ったとしましょう:

    CREATE TABLE Parent (
      ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
      ParentName nvarchar(255) NOT NULL
    )
    CREATE TABLE Child (
      ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
      ChildName nvarchar(255) NOT NULL,
      ParentId int NOT NULL
    );

    したがって、このシナリオでは、2つのテーブルを作成するだけでした。それらの間に関係は作成されませんでした。

    さて、テーブルを作成した後、突然「ああ、関係を作成するのを忘れた!」と思い出しました。

    問題ありません。これで実行できます:

    ALTER TABLE Child
      ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)     
        REFERENCES Parent (ParentId);

    終わり。前の例と同じ詳細を使用して、関係を追加しました。

    SQLiteは、ALTER TABLEを使用した外部キ​​ーの追加をサポートしていないことに注意してください。 声明。詳細については、SQLiteの既存のテーブルに外部キーを追加する方法を参照してください。

    更新/削除時

    デフォルトでは、SQLServerの関係はON DELETE NO ACTIONを使用して作成されます およびON UPDATE NO ACTION 。したがって、前の例はこの設定を使用して作成されました。

    ただし、異なるDBMSは他のデフォルト設定を使用する場合があります。

    どちらの方法でも、コードでこれを明示的に指定できます。したがって、前の例を次のように変更できます。

    ALTER TABLE Child
      ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)     
        REFERENCES Parent (ParentId)
        ON DELETE NO ACTION    
        ON UPDATE NO ACTION;

    これが実際に意味するのは、誰かが主キーのレコードを削除または更新しようとすると、エラーが発生し、変更がロールバックされるということです。これは、システムの参照整合性を損なう可能性のある変更を防ぐためのSQLServerの方法です。

    基本的に、最初に関係を作成する理由は、参照整合性を適用するためです。

    ただし、SQLServerでこれらの状況をどのように処理するかについてはいくつかのオプションがあります。

    具体的には、次の値のいずれかを使用できます。

    • NO ACTION :エラーが発生し、親テーブルの行に対する削除/更新アクションがロールバックされます。
    • CASCADE :対応する行が親テーブルから削除/更新された場合、対応する行は参照テーブルから削除/更新されます。
    • SET NULL :外部キーを構成するすべての値がNULLに設定されます 親テーブルの対応する行が削除または更新された場合。これには、外部キー列がnull許容である必要があります。
    • SET DEFAULT :親テーブルの対応する行が削除または更新されると、外部キーを構成するすべての値がデフォルト値に設定されます。この制約を実行するには、すべての外部キー列にデフォルトの定義が必要です。列がNULL可能であり、明示的なデフォルト値が設定されていない場合、NULL 列の暗黙のデフォルト値になります。

    1. SQL Server Management Studio(SSMS)で複数のクエリと結果を並べて表示する方法-SQL Server/TSQLチュートリアルパート14

    2. SQL Server:データベースが復元状態でスタックしている

    3. IBMDB2とIRIソフトウェアの接続

    4. GIMRの旅