Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 如何查询不带';不符合他们的约束条件?_Sql Server 2005_Tsql_Foreign Keys_Foreign Key Relationship - Fatal编程技术网

Sql server 2005 如何查询不带';不符合他们的约束条件?

Sql server 2005 如何查询不带';不符合他们的约束条件?,sql-server-2005,tsql,foreign-keys,foreign-key-relationship,Sql Server 2005,Tsql,Foreign Keys,Foreign Key Relationship,SQLServer2005 我正在将外键约束添加到据称不需要它们的应用程序的数据库中。当然,数据变得不可靠,外键字段中存在孤立条目 设置: 两个表,TableUser和TableOrder。 TableUser具有主键“UserID”,TableOrder具有外键“UserID” 如何查找TableOrder.UserID在TableUser.UserID中没有匹配项的行 例如,TableOrder.UserID的值为250,但没有与250匹配的TableUser.UserID键。这里有一种方法

SQLServer2005

我正在将外键约束添加到据称不需要它们的应用程序的数据库中。当然,数据变得不可靠,外键字段中存在孤立条目

设置:
两个表,TableUser和TableOrder。 TableUser具有主键“UserID”,TableOrder具有外键“UserID”

如何查找TableOrder.UserID在TableUser.UserID中没有匹配项的行

例如,TableOrder.UserID的值为250,但没有与250匹配的TableUser.UserID键。

这里有一种方法:

select * from TableOrder where UserID not in (select UserID from TableUser);

编写此类查询有许多不同的方法。

另一种常用方法是左外连接:

SELECT * FROM TableOrder o
LEFT OUTER JOIN TableUser u ON o.UserID = u.UserID
WHERE u.UserID is NULL

如果没有where子句,此查询也很有用,可以浏览并查看相应的值(如果存在),并查看哪些值不匹配。

表中没有FK约束。这些代码与FK和PK一样使用,但没有进行编码——人们相信它们是不必要的开销。我们有所有的列,但没有编码约束。当我把它们放进去以便强制执行时,我发现有很多违规行为

你的问题突出了问题所在。它们不是不必要的开销,它们阻止人们进行一般的数据库关联


格雷格和布拉德的答案都帮了我。

一旦你找到了答案,你想用它们做什么?例如,删除它们?呃,如果有外键,怎么可能没有匹配项?您的SQL中是否有硬编码的FK?他指的是一个表,其中的字段被应用程序视为外键,但从未被数据库本身强制执行。或者FK约束是在该事实之后添加的(SQL Server默认情况下不会将其应用于现有行),或者,如果有人关闭FK验证以强制执行某项操作,并因此导致数据库出错(看到太多次),我认为这是一个常见的误解。很多人认为应该在中间层做业务逻辑。但是FK是任何关系数据库的基本部分。如果数据库做不好,那么还有其他问题。。。