2

我有2個表,這裏我試圖插入一個FK關係。但是,當我嘗試修改表格以創建FK關係時,我遇到了錯誤,請幫助...我在兩個表中都有俱樂部ID,我在下面評論過,但我不確定爲什麼我仍然收到約束錯誤。更改聲明與外鍵衝突,但ID存在於表

什麼導致了約束錯誤?

CREATE TABLE [dbo].[Clubs](
[ClubID] [int] IDENTITY(1,1) NOT NULL, // ClubID is here 
[Name] [nvarchar](128) NOT NULL, 
[Description] [nvarchar](2047) NULL, 
[Created] [datetime] NOT NULL, 
[Modified] [datetime] NULL, 


CONSTRAINT [PK_Clubs] PRIMARY KEY CLUSTERED 
(
    [ClubID] 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].[MemberClubs](
[MemberClubID] [int] IDENTITY(1,1) NOT NULL, 
[MemberID] [bigint] NOT NULL, 
[ClubID] [int] NOT NULL,    //Club ID is here as well 
CONSTRAINT [PK_MemberClubs] PRIMARY KEY CLUSTERED 
(
    [MemberClubID] 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 SET IDENTITY_INSERT [dbo].[MemberClubs] ON 
GO INSERT [dbo].[MemberClubs] ([MemberClubID], [MemberID], [ClubID]) VALUES (1, 1, 1) 
GO INSERT [dbo].[MemberClubs] ([MemberClubID], [MemberID], [ClubID]) VALUES (2, 2, 1) 
GO INSERT [dbo].[MemberClubs] ([MemberClubID], [MemberID], [ClubID]) VALUES (3, 3, 1) 
GO INSERT [dbo].[MemberClubs] ([MemberClubID], [MemberID], [ClubID]) VALUES (4, 4, 1) 
GO INSERT [dbo].[MemberClubs] ([MemberClubID], [MemberID], [ClubID]) VALUES (5, 5, 1) 
GO SET IDENTITY_INSERT [dbo].[MemberClubs] OFF 
GO 


// *** The error is over here 
ALTER TABLE [dbo].[MemberClubs] WITH CHECK ADD CONSTRAINT [FK_MemberClubs_Clubs] FOREIGN KEY([ClubID]) 
REFERENCES [dbo].[Clubs] ([ClubID]) 
GO 

// $$$ The second FK constraint error is over here 
ALTER TABLE [dbo].[MemberClubs] CHECK CONSTRAINT [FK_MemberClubs_Clubs] 
GO 

ALTER TABLE [dbo].[MemberClubs] WITH CHECK ADD CONSTRAINT [FK_MemberClubs_Members] FOREIGN KEY([MemberID]) 
REFERENCES [dbo].[Members] ([MemberID]) 
GO 

ALTER TABLE [dbo].[MemberClubs] CHECK CONSTRAINT [FK_MemberClubs_Members] 
GO 

錯誤

消息547,級別16,狀態0,行* * *(上圖)

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_MemberClubs_Clubs". The conflict occurred in database "newDb", table "dbo.Clubs", column 'ClubID'. 

消息4917,級別16,狀態0,行$$$(上圖)

Constraint 'FK_MemberClubs_Clubs' does not exist. 

消息4916,級別16,狀態0,$$$線(上圖)

Could not enable or disable the constraint. See previous errors. 
+0

這看起來像會員和俱樂部之間的中間表。執行此操作的標準方法是創建MemberID和ClubID的組合鍵,而不是在此表中爲主鍵創建標識列。 –

+0

@SeanLange可以改變設計並影響一些代碼。但是如果它使它更簡單或更清潔,我可以做到這一點。我不確定我是否理解組合鍵如何更好(關聯表),即我正在考慮像C#這樣的組合鍵。除非在Sql中有不同之處 – Crew

+0

問題是您已經擁有主鍵所需的值。它使用了一個簡單的自然鍵,而不是隻編一個幻數。從設計角度來看,這將是首選。 –

回答

2

你面前,然後添加一個外鍵關係Clubs加5行到表MemberClubs引用Club.ClubId = 1

所以爲了保持參照完整性,你需要添加/啓用外鍵約束之前,ClubId = 1添加一行到Clubs

SET IDENTITY_INSERT [dbo].[Clubs] ON 
INSERT INTO [dbo].[Clubs](ClubId, Name, Description, Created, Modified) 
     VALUES (1, 'Foo', 'Bar', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP) 
SET IDENTITY_INSERT [dbo].[Clubs] OFF 

然後外鍵創建成功:

ALTER TABLE [dbo].[MemberClubs] WITH CHECK 
    ADD CONSTRAINT [FK_MemberClubs_Clubs] FOREIGN KEY([ClubID]) 
REFERENCES [dbo].[Clubs] ([ClubID]) 
GO 
+0

奇怪的是,如果我運行'ALTER TABLE [dbo]。[MemberClubs] CHECK CONSTRAINT [FK_MemberClubs_Clubs] GO ALTER TABLE [dbo]。[MemberClubs] WITH CHECK ADD CONSTRAINT [FK_MemberClubs_Members] FOREIGN KEY([MemberID ]) 參考文獻[dbo]。[Members]([MemberID]) GO'在腳本錯誤之後 - 它工作並創建關係! – Crew

2

如果這不是一個示例,並且是您實際嘗試完成的任務,那麼通過查看腳本可以看到的一件事就是您嘗試使用不一致的數據與表創建FK關係。

爲了創建約束條件,必須存在一致的數據。在您的發佈代碼中,Club s沒有數據,因此由於MemberClubs具有「孤立」數據(例如,數據)而無法成功創建約束。 MemberClubs正在嘗試引用Clubs中不存在的項目。

+0

你是說如果我離開這兩行數據,這可能會奏效。我正在嘗試它。 – Crew