查找与现有主键不匹配的列

时间:2009-07-24 15:22:07

标签: sql sql-server visual-studio-2008 sql-server-2005

我正在尝试向表中添加外键,但数据库Sql Server 2005不喜欢它。

它表示列与现有主键或唯一约束不匹配。

如何找到有问题的列,以便删除/更改它们并添加外键?

4 个答案:

答案 0 :(得分: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中没有相应父级的不同值。

答案 1 :(得分: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 :(得分: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都支持此功能。这个没有EXISTS的公式应该适用于大多数地方:

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

答案 3 :(得分:0)

因此,TableA的列为X,TableB的列为Y.并且您希望使Y成为外键,以便TableB.Y的所有值都是TableA.X中的值,是否正确?

为此,TableA.X需要具有主键或唯一约束。听起来并非如此。首先使TableA.X唯一,然后从TableB.Y定义您的FK引用TableA.X