【发布时间】:2009-07-24 15:22:07
【问题描述】:
我正在尝试向表中添加外键,但数据库 Sql Server 2005 不喜欢它。
它表示列与现有的主键或唯一约束不匹配。
如何找到有问题的列,以便删除/更改它们并添加外键?
【问题讨论】:
标签: sql sql-server visual-studio-2008 sql-server-2005
我正在尝试向表中添加外键,但数据库 Sql Server 2005 不喜欢它。
它表示列与现有的主键或唯一约束不匹配。
如何找到有问题的列,以便删除/更改它们并添加外键?
【问题讨论】:
标签: sql sql-server visual-studio-2008 sql-server-2005
对相关键的父表进行左连接,然后检查子表中左连接的父表中的值为空的值。
例如,如果这是您的架构...
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 中没有相应的父项。
【讨论】:
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 将成为外键。
【讨论】:
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 都支持这一点。这种不存在的公式应该适用于大多数地方:
SELECT *
FROM FK_Table
WHERE NOT EXISTS (SELECT 1
FROM PK_Table
WHERE FK_Col1 = PK_Col1 AND FK_Col2 = PK_Col2
);
【讨论】:
所以你有一个带有 X 列的 TableA 和一个带有 Y 列的 TableB。并且你想让 Y 成为一个外键,这样 TableB.Y 的所有值都是 TableA.X 中的值,对吗?
为此,TableA.X 需要具有主键或唯一约束。听起来情况并非如此。首先使 TableA.X 独一无二,然后从 TableB.Y 中定义您的 FK,并引用 TableA.X
【讨论】: