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

UPDATEステートメントがREFERENCE制約と競合していました-SQLServer/TSQLチュートリアルパート76

    シナリオ:

    あなたはSQLServer開発者として働いており、テーブルの1つに更新ステートメントを記述し、以下のエラーが発生しました。


    Msg 547、レベル16、状態0、行32
    UPDATEステートメントがREFERENCE制約"FK_"と競合していました。
    データベース"YourDatabaseName"、テーブル "SchemaName.YourTableName"、列'ColumnName'で競合が発生しました。
    ステートメントは終了しました。

    この問題を解決するにはどうすればよいですか?

    解決策:

    以下のスクリプトを使用して、最初にこのエラーを作成しましょう。 2つのテーブルdbo.Customerとdbo.Ordersを作成します。テーブルには主キーと外部キーの関係があります。

    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
        ,Customer_id INT FOREIGN KEY REFERENCES Customer(CustomerId)
        )
    
    
        --insert sample data
         insert into dbo.Customer 
        (CustomerId,FName, LName,SSN)
         values
        (1,'Aamir','Shahzad','000-000-00')
    
        insert into dbo.Orders
        (OrderItemName,OrderItemAmt,Customer_Id)
        values ('TV',1,1)
     
     
    SQLServerで列が外部キー制約によって参照されている場合にレコードを更新する方法

    ここで、dbo.CustomerのCustomerId値が正しくなく、更新する必要があると感じた場合を考えてみましょう。以下のupdateステートメントを記述して、CustomerIdを100に更新しました。
        update dbo.Customer
        set Customerid=100
     
    以下のエラーが発生します。
    メッセージ547、レベル16、状態0、33行目UPDATEステートメントがREFERENCE制約「FK__Orders__Customer__1ED998B2」と競合しました。データベース"YourDatabaseName"、テーブル "dbo.Orders"、列'Customer_id'で競合が発生しました。ステートメントは終了しました。
    dbo.OrdersテーブルにCustomer_idvalue =100がないため、更新できません。参照テーブルのレコード。ここで、最初に親テーブル(dbo.Orders)を修正してから、dbo.Customerテーブルを更新できると考えました。
        update dbo.Orders
        set Customer_Id=100
     
     
     ここでも、dbo.Customerテーブルで利用可能なCustomerId =100がないため、次のようなエラーが発生しました。
    Msg 547、レベル16、状態0、行36UPDATEステートメントがFOREIGNKEY制約"FK__Orders__Customer__1ED998B2と競合しました"。データベース「YourDatabaseName」、テーブル「dbo.Customer」、列「Customerid」で競合が発生しました。ステートメントは終了しました。

    ここから複数のソリューションを利用できます> 1) レコードを更新する代わりに、レコードを参照テーブル(Dbo.Customer)に挿入し、次に親テーブル(Dbo.Orders)のレコードを更新し、最後に既存のレコードを参照テーブルから削除します。
        --Insert Record in Reference Table First
         insert into dbo.Customer 
        (CustomerId,FName, LName,SSN)
         values
        (100,'Aamir','Shahzad','000-000-00')
    
        --Update the Records in Parent Table 
            update dbo.Orders
        set Customer_Id=100
    
        --Delete the old record from Reference Table
        Delete from dbo.Customer
        where CustomerId=1
     
     
     今すぐテーブルのレコードを確認してください。
    SQLServerの外部キー制約によって参照されるときに列値を更新する方法

    2)外部キー制約を無効にし、値を手動で更新します 別の解決策として、外部キー制約を無効にし、レコードを更新して、最後に外部キーを再度有効にすることができます。
    --Find the Foreign Key Constraint with Table Name
        USE YourDatabaseName
        GO
        Select 
        Schema_name(Schema_id) as SchemaName,
        object_name(Parent_object_id) as TableName,
        name as ForeignKeyConstraintName
        from sys.foreign_keys
     
     
    以下のステートメントを使用して外部キー制約を無効にします
    SyntaxALTERTABLE SchemaName.ParentTableNameNOCHECK CONSTRAINT Constraint_Name
    以下のステートメントを使用して、dbo.Ordersテーブルの外部キー制約を無効にしました。
    --Disable Foregin Key by using NOCHECK
    ALTER TABLE dbo.Orders
    NOCHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E
    
    --Run Update Statements
        update dbo.Customer
        set Customerid=100
    
        update dbo.Orders
        set Customer_Id=100
    
    
    を実行します 外部キー制約の有効化SyntaxALTERTABLESchemaName.ParentTableNameCHECK CONSTRAINT Constraint_Name

    以下のスクリプトを実行して、dbo.Ordersテーブルで外部キー制約を有効にします。
    --Enable Foreign Key Constraint by using CHECK
    ALTER TABLE dbo.Orders
    CHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E


    ビデオデモ:UPDATEステートメントがREFERENCE制約と競合しました

    1. MySQLINクエリで順序を維持する

    2. psqlを使用してPostgreSQLでデータベースとテーブルを一覧表示する方法

    3. SQLでカウント順に並べ替える方法は?

    4. SQLServer2019でのスカラーUDFインライン化