12

私はこのテーブルを持っています

CREATE TABLE [dbo].[CityMaster](
    [CityID] [int] NOT NULL,
    [City] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [BranchId] [varchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL CONSTRAINT [DF__CityM__Branc__74444068]  DEFAULT ((0)),
    [ExternalBranchId] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
 CONSTRAINT [PK_CityMaster] PRIMARY KEY CLUSTERED 
(
    [City] ASC,
    [BranchId] ASC
),
 CONSTRAINT [uk_citymaster_cityid_branchid] UNIQUE NONCLUSTERED 
(
    [CityID] ASC,
    [BranchId] ASC
)
)

そして別のテーブル

CREATE TABLE [dbo].[CustomerMaster](
    [ID] [int] NOT NULL,
    [CustomerCode] [varchar](20) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [CustomerName] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [CustomerAddress] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [CustomerPhone] [varchar](max) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [CustomerEmailId] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [CustomerPriority] [int] NOT NULL CONSTRAINT [DF_CustomerMaster_CustomerPriority]  DEFAULT ((0)),
    [CustomerRegisterDate] [datetime] NULL,
    [CustomerIsActive] [bit] NULL CONSTRAINT [DF_CustomerMaster_CustomerIsActive]  DEFAULT ((1)),
    [BranchId] [varchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL CONSTRAINT [DF__CustomerM__Branc__67DE6983]  DEFAULT ((0)),
    [CityId] [int] NULL CONSTRAINT [DF_CustomerMaster_CityId]  DEFAULT ((0)),
 CONSTRAINT [PK_CustomerMaster] PRIMARY KEY CLUSTERED 
(
    [CustomerCode] ASC,
    [BranchId] ASC
)
) ON [PRIMARY]

ALTER TABLE [dbo].[CustomerMaster]  WITH CHECK ADD  CONSTRAINT [fk_cdCityId_CityId] FOREIGN KEY([CityId], [BranchId])
REFERENCES [dbo].[CityMaster] ([CityID], [BranchId])

ALTER TABLE [dbo].[CustomerMaster] CHECK CONSTRAINT [fk_cdCityId_CityId]

ご覧のとおり、 に外部キーがありますCityId, BranchId。私が抱えている問題は、ユーザーが自分の都市を入力しない場合 (入力しないことを選択できます。このフィールドは必須ではありませCityIdん。空白になり、この値をCustomerMasterテーブルに挿入しようとすると、このエラーが表示されます)

INSERT ステートメントが FOREIGN KEY 制約 "fk_cdCityId_CityId" と競合しました。データベース「TestDatabase」、テーブル「dbo.CityMaster」で競合が発生しました。ステートメントは終了されました。

だから、これを回避する方法を知りたいです。一意の列または主キーの列が外部キーとして参照されているかどうかはわかっていますが、null にすることはできません。しかし、私が設定したときは on delete set nullどうですか?その場合、その行が削除されると、 inCityMasterに設定さnullれますCustomerMaster(すべての参照を意味します)。それが可能な場合、この外部キーの値をnull手動で設定する理由と方法を教えてください。それがどうしても不可能な場合、私が説明した状況を回避する最善の方法は何ですか?

4

2 に答える 2

21

CityIdが に設定されている場合NULL、外部キー制約はチェックされず、すべて問題ありません。

一方、CityIdが 0 の場合 (たとえば、指定したため...)、 forにDEFAULT ((0))一致する行がない場合、実際には制約チェックが失敗します。CityMaster0,BranchId

複合キーの外部キー制約は、関連するすべての列が非である場合にのみチェックされますNULL

于 2012-09-19T13:05:49.490 に答える
3

で変更insert query @

[CityId] [int] DEFAULT NULL

Nullこれにより、デフォルトとして宣言したとおりに値を保存できます。

于 2015-04-25T09:44:54.197 に答える