我正在尝试向表中添加外键,但数据库Sql Server 2005不喜欢它。
它表示列与现有主键或唯一约束不匹配。
如何找到有问题的列,以便删除/更改它们并添加外键?
答案 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