2009-07-24 90 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