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

柔軟な外部キー

    これを解決する1つの方法は、データベースにテーブルを追加して他のテーブルのベースのように機能させ、他のテーブルと1対1の関係で接続してから、イベントテーブルをこのベーステーブルに接続することです。
    これにより、各テーブルのデータの整合性を維持できます。
    ベーステーブルは、1つの列のように単純にすることも、他のすべてのテーブルに共通する列を含めることもできます。これにより、一種の「データ構造の「継承」。

    ベーステーブルを作成します(他のテーブル間に共通の列がないと仮定します):

    CREATE TABLE TblObjectBase 
    (
        ObjectBase_Id int IDENTITY(1,1) PRIMARY KEY
    )
    

    次に、ObjectIdによって参照される必要がある他のテーブルの場合 Eventsで テーブル:

    CREATE TABLE TblClients 
    (
        Client_Id int PRIMARY KEY,
        Client_FirstName varchar(10),
        Client_LastName varchar(10),
        --  Other client related data
        CONSTRAINT FK_TblClients_TblObjectBase
                   FOREIGN KEY(Client_Id) 
                   REFERENCES TblObjectBase(ObjectBase_Id)
    )
    
    CREATE TABLE TblInvoices
    (
        Invoice_Id int PRIMARY KEY,
        -- other incoice related data
         CONSTRAINT FK_TblInvoices_TblObjectBase
                   FOREIGN KEY(Invoice_Id) 
                   REFERENCES TblObjectBase(ObjectBase_Id)
    )
    

    残っているのは、他のテーブルに挿入するためにTblObjectBaseに新しい値を挿入することだけです。これは、ストアドプロシージャによって、または挿入トリガーの代わりに簡単に実現できます。
    挿入プロシージャは、次のようになります。

    CREATE PROCEDURE Insert_TblClients
    (
        @Client_FirstName varchar(10),
        @Client_LastName varchar(10),
        -- any other client related data you might have
    )
    AS
    DECLARE @ClientId int
    
    -- Insert a new record to the base table:
    INSERT INTO TblObjectBase DEFAULT VALUES;
    
    -- Get the id you've just inserted:
    SELECT @ClientId = SCOPE_IDENTITY();
    
    -- Insert the data to the clients table:
    INSERT INTO TblClients 
    (Client_Id, Client_FirstName, Client_LastName.....) VALUES
    (@ClientId, @Client_FirstName, @Client_LastName...)
    

    挿入トリガーの代わりに次のようになります:

    CREATE TRIGGER TblClients_IO_Insert ON TblClients INSTEAD OF INSERT 
    AS
    BEGIN
    
    DECLARE @ClientId int
    
    -- Insert a new record to the base table:
    INSERT INTO TblObjectBase DEFAULT VALUES;
    
    -- Get the id you've just inserted:
    SELECT @ClientId = SCOPE_IDENTITY();
    
    INSERT INTO TblClients 
    (Client_Id, Client_FirstName, Client_LastName.....) 
    SELECT @ClientId, Client_FirstName, Client_LastName..... 
    FROM inserted
    
    END
    

    挿入の代わりに使用することを選択した場合、Identity値が別のテーブルから取得されるという事実は、クライアント(vb.netプログラム)に対して透過的である必要があります。



    1. SpringDataR2dbcでテーブル間の関係を処理するためのベストプラクティス

    2. MySqlがすべてのデータをフェッチした後、スクロール機能を停止する方法

    3. 削除、派生テーブルで更新しますか?

    4. mysql更新クエリはインデックスの恩恵を受けますか?