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

ALTERTABLEステートメントがSQLServerのFOREIGNKEY制約と競合していました-SQLサーバー/TSQLチュートリアルパート69

    シナリオ:

    主外部キーの関係を持たない2つのテーブルdbo.Customerとdbo.Ordersを作成しました。テーブルを作成した後、いくつかのレコードを挿入しました。後で、外部キー制約を追加することになっていることに気づきました。 dbo.Ordersテーブルを変更しようとすると、エラーが発生しました。

    以下のスクリプトを使用して、dbo.CustomerテーブルとDbo.Orderテーブルを作成します

    USE YourDatabaseName
    GO
    
    CREATE TABLE dbo.Customer (
        Customerid INT PRIMARY KEY
        ,FName VARCHAR(100)
        ,LName VARCHAR(100)
        ,SSN VARCHAR(10)
        )
    
    CREATE TABLE dbo.Orders (
        OrderId INT Identity(1, 1)
        ,OrderitemName VARCHAR(50)
        ,OrderItemAmt INT,
        CustomerId int
        )
     以下のスクリプトを使用してサンプルレコードを挿入します。

         INSERT INTO dbo.Customer 
        (CustomerId,FName, LName,SSN)
         VALUES
        (1,'Aamir','Shahzad','000-000-00')
    
        INSERT INTO dbo.Orders
        (OrderItemName,OrderItemAmt,Customerid)
        values ('TV',2,2)
     次に、外部キー制約を追加しましょう

        Alter table dbo.Orders
        Add Constraint Fk_CustomerId  
        Foreign Key(CustomerId) References dbo.Customer(CustomerId)
     
     
     上記のスクリプトを実行すると、以下のエラーが発生します。

    Msg 547、レベル16、状態0、行31
    ALTERTABLEステートメントがFOREIGNKEY制約「Fk_CustomerId」と競合しました。データベース"YourDatabaseName"、テーブル "dbo.Customer"、列'Customerid'で競合が発生しました。

    dbo.CustomerのCustomerId列の値は1であり、dbo.Ordersテーブルの列CustomerIdの値は2です。 。値が一致していません。それが上記のエラーを受け取った理由です。

    解決策:

    1)2番目のテーブル(dbo.Orders)のデータを修正します 2番目のテーブルのデータを修正し、CustomerId列の値を更新できます。プライマリテーブル(Dbo.Customer.CustomerId)と一致する正しいデータが得られたら、問題なく外部キー制約を作成できます。
    2)チェックなしでテーブルの変更を使用(既存のデータを無視) ) 既存のデータの関係を気にしない場合。 WITH NoCheck with alter tableステートメントを使用すると、データを検証して外部キー制約を作成するためのチェックが無視されます。外部キー制約が作成されると、挿入された新しいレコードの整合性が強制されます。
        Alter table dbo.Orders with Nocheck
        Add Constraint Fk_CustomerId  
        Foreign Key(CustomerId) References dbo.Customer(CustomerId)
     
     
    
    
    
    
    Video Demo
    
    


    1. 文字列を格納するためにデータ型テキストを使用することの欠点はありますか?

    2. Oracle Database Security –暗号化と復号化

    3. SQL ServerのFILE_ID()とFILE_IDEX()の違い:違いは何ですか?

    4. Postgres-XL9.6の新機能