2009-07-24 46 views
2

我想添加一個外鍵的表,但數據庫,SQL Server 2005中,不喜歡它的列。查找不匹配現有的主鍵

它說,列不匹配現有的主鍵或唯一約束。

我怎樣才能找到問題的欄目,所以我可以刪除/修改並添加外鍵?

回答

5

不要左連接到父表上有問題的關鍵,然後在子表其中左加入父表中的值是零檢查值。

例如,如果這是你的架構......

table1: 
    myKey int primary key, 
    ...other columns... 

table2: 
    otherKey int primary key, 
    myKeyFromTable1 int 
    ...other columns... 

你可以這樣做:

select distinct 
    t2.myKeyFromTable1 

from table2 t2 

left join table1 t1 on t1.myKey = t2.myKeyFromTable1 

where t1.myKey is null 

這將使你的唯一值table2,不會有相應的父母在table1

4
SELECT 
    ForeignKey 
FROM 
    FK_TABLE f 
LEFT JOIN 
    PK_TABLE p ON f.ForeignKey = p.PrimaryKey 
WHERE 
    p.PrimaryKey = NULL 

這應該做到這一點。

ForeignKey的=你想成爲一個外鍵
PK_TABLE列=你想要的表的外鍵引用
的PrimaryKey =列ForeignKey的將是一個外鍵。

2
SELECT * 
    FROM FK_Table 
WHERE ForeignKey NOT IN (SELECT PrimaryKey FROM PK_Table); 

這適用於爲單列鍵編寫的。它也可以用於多列鍵,如果您的DBMS允許表示法:

SELECT * 
    FROM FK_Table 
WHERE (FK_Col1, FK_Col2) NOT IN (SELECT PK_Col1, PK_Col2 FROM PK_Table); 

不過,並不是每個DBMS都支持這一點。這一提法與NOT EXISTS應該工作最多的地方:

SELECT * 
    FROM FK_Table 
WHERE NOT EXISTS (SELECT 1 
        FROM PK_Table 
        WHERE FK_Col1 = PK_Col1 AND FK_Col2 = PK_Col2 
       ); 
0

所以,你必須與列X TableA的,並與列Y.表B你想使Y上外鍵,以便TableB.Y的所有值TableA.X中的值是否正確?

要做到這一點,TableA.X需要有任何主鍵或在其上的唯一約束。聽起來似乎並非如此。讓TableA.X獨特的,然後再定義從TableB.Y您的FK引用TableA.X

+0

我認爲創建FK的語句傳遞「有沒有在PK臺上的PK或唯一約束」測試。問題是,通過驗證FK表中的每一行與PK表中的某個值匹配的部分方式是發現FK列中的值與PK表中的任何行都不匹配 - 因此無法創建密鑰。 – 2009-07-25 00:00:24