-1

子テーブルの行を削除したい。エラーが発生します

DELETEステートメントがREFERENCE制約「FK_Address_UserDataSet」と競合していました。データベース「XYZ」、テーブル「dbo.Address」、列「DataSetId」で競合が発生しました。ステートメントは終了されました。

UserDataSet親と子の テーブルを持つデータベース構造がありAddressます(親は任意の数の子を持つことができます)。

子がDataSetId有効なに関連していることを要求する外部キー制約(エラーで言及)がありますUserDataSet

MS SQL Server Management Studio 2008簡略化された形式で作成されたテーブルスクリプトと制約スクリプトは次のとおりです。

CREATE TABLE [dbo].[Address](
    [AddressId] [int] IDENTITY(1,1) NOT NULL,
    [DataSetId] [int] NOT NULL,
        --other fields
 CONSTRAINT [PK_Address] PRIMARY KEY CLUSTERED 
(
    [AddressId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

---

CREATE TABLE [dbo].[UserDataSet](
    [DataSetId] [int] IDENTITY(1,1) NOT NULL,
        --other fields
 CONSTRAINT [PK_UserDataSet] PRIMARY KEY CLUSTERED 
(
    [DataSetId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

---Create the constraint

ALTER TABLE [dbo].[Address]  WITH NOCHECK ADD  CONSTRAINT [FK_Address_UserDataSet] FOREIGN KEY([DataSetId])
REFERENCES [dbo].[UserDataSet] ([DataSetId])
GO

ALTER TABLE [dbo].[Address] CHECK CONSTRAINT [FK_Address_UserDataSet]
GO

しかし、この設定では、(親ではなく)子を削除することがどのように問題になるのでしょうか。

削除する行が現在無効であり、おそらく制約が(まだ)使用されていないときに追加された可能性があります)、無効な外部キーを持つ子を削除するときに制約が適用されるようになりましたか?

4

1 に答える 1

1

なぜ制約を追加するのNOCHECKですか?

MSDNドキュメントから..。

既存のデータに対して新しいCHECKまたはFOREIGNKEY制約を検証したくない場合は、WITHNOCHECKを使用します。まれな場合を除いて、これを行うことはお勧めしません。新しい制約は、以降のすべてのデータ更新で評価されます。制約が追加されたときにWITHNOCHECKによって抑制された制約違反があると、制約に準拠していないデータで行を更新すると、将来の更新が失敗する可能性があります。

于 2013-02-15T13:56:55.197 に答える