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

SQLServerの複数の列に外部キー制約を作成する方法-SQLServer/TSQLチュートリアルパート67

    シナリオ:

    SQL Server開発者として作業している場合は、列FNameおよびSSNを使用して、複合主キーを持つテーブルdbo.Customerを作成する必要があります。 dbo.Customerテーブルで主キーの作成が完了したら、2番目のテーブルdbo.Ordersを作成し、主キー列を使用して外部キー制約を作成する必要があります。

    解決策:

    以下のスクリプトを使用して、複合主キーを使用してdbo.Customerテーブルを作成しましょう。

    USE YourDatabaseName
    GO
    
    CREATE TABLE dbo.Customer (
        Customerid INT Identity(1,1)
        ,FName VARCHAR(100) Not Null
        ,LName VARCHAR(100)
        ,SSN VARCHAR(10) Not Null,
        Constraint Pk_FName_SSN Primary Key (FName,SSN)
        )




    緑色で強調表示されているConstraintConstraint_Name主キー(Column1、Column2)を使用して、複合主キーを作成していることに注意してください。
    dbo.Ordersを作成しましょう。以下のスクリプトを使用してテーブルを作成します。

    CREATE TABLE dbo.Orders (
        OrderId INT Identity(1, 1)
        ,OrderitemName VARCHAR(50)
        ,OrderItemAmt INT
        ,FirstName VARCHAR(100),
         SSN VARCHAR(10) Not Null,
         Constraint Fk_Order_Customer_FName_SSN 
         FOREIGN KEY (FirstName,SSN) REFERENCES dbo.Customer(FName,SSN)
        )




    複数の列を持つ外部キー制約を作成するには、緑色で強調表示されているスクリプトを使用します。 Constraint Constraint_Name外部キー(Column1、Column2)参照dbo.PrimaryKeyTable(PrimaryKeyColumn1、PrimaryKeyColumn2)
    dbo.Ordersでは、dbo.CustomerテーブルにあるFNameではなくFirstName列があることがわかります。これは、外部キー参照を作成するときに、両方のテーブルで同じ列名を使用する必要がないことを意味します。

    各テーブルにレコードを挿入して、すべてが外部キーで正常に機能するかどうかを確認しましょう。 Constraint。
         INSERT INTO dbo.Customer 
        (FName, LName,SSN)
         values
        ('Aamir','Shahzad','000-000-01')
    
        INSERT INTO dbo.Orders
        (OrderItemName,OrderItemAmt,FirstName,SSN)
        values ('TV',1,'Aamir','000-000-01')
     
     レコードが正常に挿入されました。 Select query 
    を使用して確認しましょう
    SQLServerテーブルの複数の列に外部キー制約を作成する方法


    dbo.Customerに存在しない値をdbo.Ordersに挿入してみましょう。外部キー制約によるエラーとして発生するはずです。
        INSERT INTO dbo.Orders
        (OrderItemName,OrderItemAmt,FirstName,SSN)
        values ('TV',1,'Aamir','000-000-02')

    強調表示されたSSN値がdbo.Customerに存在しないため、以下のエラーが発生しました。
    メッセージ547、レベル16、状態0、行30INSERTステートメントがFOREIGNKEY制約「Fk_Order_Customer_FName_SSN」と競合しました。データベース「YourDatabaseName」、テーブル「dbo.Customer」で競合が発生しました。ステートメントは終了しました。


    ***列の順序は、外部キー制約を作成するときに主キーにあるものと同じである必要があります。異なる順序で外部キー制約を作成しようとすると、以下のエラーが発生します。
        CREATE TABLE dbo.Orders (
        OrderId INT Identity(1, 1)
        ,OrderitemName VARCHAR(50)
        ,OrderItemAmt INT
        ,FirstName VARCHAR(100),
         SSN VARCHAR(10) Not Null,
         Constraint Fk_Order_Customer_FName_SSN 
         FOREIGN KEY (SSN,FirstName) REFERENCES dbo.Customer(SSN,FName)
        )
     
     メッセージ1776、レベル16、状態0、行13参照されるテーブル'dbo.Customer'には、外部キー'Fk_Order_Customer_FName_SSN'の参照列リストに一致する主キーまたは候補キーがありません。メッセージ1750、レベル16、状態0、行13制約またはインデックスを作成できませんでした。以前のエラーを参照してください。


    ビデオデモ:SQLServerの複数の列に外部キー制約を作成する方法







    1. SQLServerで文字列を分割する

    2. Oracleに対して実行されたクエリを確認するにはどうすればよいですか?

    3. SQL Serverで文字列のすべての出現箇所を別の文字列に置き換える方法– REPLACE()

    4. データをHerokuにプッシュするときのエラー:タイムゾーンの変位が範囲外です