2009-12-16 97 views
1

我想創建一個由int列和datetime列組成的外鍵約束(兩者都不爲空)。SQL Server外鍵問題

我收到錯誤 「引用表X中沒有與外鍵FK中的引用列表匹配的主鍵或候選鍵」。

通常,此錯誤表示目標表中的列不是唯一的。 但它是主鍵,所以它絕對是獨一無二的。

外鍵正在引用的表跨多個文件組進行分區 - 而在其上創建外鍵的表駐留在主文件組上。這可能是問題嗎? 日期時間可以成爲外鍵的一部分嗎?

表X:

LineId (int not null) (PK) 
CreatedAt (datetime not null) (PK) 
Message (nvarchar(max)) 
userId (int not null) 

表Y:

LineId (int not null) (PK) (FK) 
SId (int not null) (PK) 
LineCreatedAt (datetime not null) (FK) 
CreatedAt (datetime not null) 

SQL命令:

ALTER TABLE Y 
ADD CONSTRAINT [FK1] 
FOREIGN KEY(LineId,LineCreatedAt) 
REFERENCES X(LineId, CreatedAt) 

理解任何想法。

謝謝

+0

是否有可能向我們展示您的表格架構? – Graviton 2009-12-16 11:11:13

+0

我想知道是否因爲表X的索引在分區方案上,而表Y不是? – Chris 2009-12-16 12:23:24

回答

0

不,您收到的錯誤並不意味着列不是唯一的。 這意味着您所引用的列與外表中的列不匹配。 你能顯示2個表格和你的FK定義嗎?

0

我已經在SQL2005 Dev版本中測試過了,在PRIMARY文件組中創建了表X和Y.我沒有麻煩(因爲我懷疑我不會)創建你描述的外鍵。我也懷疑(但我不太確定)是否將表分區到多個文件組中,這樣會影響到這一點。

您能否提供您用於創建表格的SQL?這可能會揭示出問題的原因,特別是如果有一些奇怪的設置處於活動狀態(並且SQL Server充滿了奇怪的設置)。

0

顯然問題出在內部列的排序按鍵。 由於表X的主鍵是(CreatedAt,LineId), 改變腳本:

ALTER TABLE Y 
ADD CONSTRAINT [FK1] 
FOREIGN KEY(LineCreatedAt,LineId) 
REFERENCES X(CreatedAt,LineId) 

成功合作。 這是一個很糟糕的錯誤,但是在查看對象資源管理器時,您只能看到鍵列,而不是鍵內的順序。