Fro*_*840 291 sql foreign-keys
我正在对数据库应用程序进行一些维护工作,并且我发现,欢乐的乐趣,即使来自一个表的值正在使用外键的样式,表上没有外键约束.
我正在尝试在这些列上添加FK约束,但我发现,因为表中的错误数据已经完全加载了以前的错误,这些错误已经被天真地纠正过,我需要找到没有的行.匹配其他表,然后删除它们.
我在网上找到了一些这种查询的例子,但它们似乎都提供了例子而不是解释,我不明白为什么它们起作用.
有人可以向我解释如何构建一个查询,该查询返回在另一个表中没有匹配的所有行,以及它正在做什么,以便我可以自己进行这些查询,而不是为这个混乱中的每个表运行到SO 没有FK约束?
Ada*_*Dev 549
这是一个简单的查询:
SELECT t1.ID
FROM Table1 t1
LEFT JOIN Table2 t2 ON t1.ID = t2.ID
WHERE t2.ID IS NULL
Run Code Online (Sandbox Code Playgroud)
关键点是:
LEFT JOIN用来; 这将返回所有行Table1,无论是否有匹配的行Table2.
该WHERE t2.ID IS NULL条款; 这会将返回的结果限制为仅返回ID的行为Table2空 - 换句话说,该特定ID中没有记录.对于未匹配ID的所有记录,将返回NULL .Table2Table1Table2.IDTable1Table2
Ond*_*zek 79
我会使用EXISTS表达式,因为它更强大,你可以更精确地选择你想要加入的行,如果LEFT JOIN你必须采取连接表中的所有内容.它的效率可能与LEFT JOIN使用零测试的情况相同.
SELECT t1.ID
FROM Table1 t1
WHERE NOT EXISTS (SELECT t2.ID FROM Table2 t2 WHERE t1.ID = t2.ID)
Run Code Online (Sandbox Code Playgroud)
小智 13
SELECT id FROM table1 WHERE foreign_key_id_column NOT IN (SELECT id FROM table2)
Run Code Online (Sandbox Code Playgroud)
表1中有一列要添加外键约束,但foreign_key_id_column不是全部的值与id表2中的值匹配.
idtable1 中的s.这些将是我们要删除的行.NOT INwhere语句中的子句将查询限制为只有其中的值foreign_key_id_column不在表2 id的列表中的行.SELECT括号中的语句将获得id表2 中所有s 的列表.现在我想要那些不在工资中的员工表中的记录。 我们可以通过 3 种方式做到这一点:
select * from employee
where id not in(select e.id from employee e inner join salary s on e.id=s.id)
Run Code Online (Sandbox Code Playgroud)
select * from employee e
left outer join salary s on e.id=s.id where s.id is null
Run Code Online (Sandbox Code Playgroud)
select * from employee e
full outer join salary s on e.id=s.id where e.id not in(select id from salary)
Run Code Online (Sandbox Code Playgroud)
小智 7
T2您要添加约束的表在哪里:
SELECT *
FROM T2
WHERE constrained_field NOT
IN (
SELECT DISTINCT t.constrained_field
FROM T2
INNER JOIN T1 t
USING ( constrained_field )
)
Run Code Online (Sandbox Code Playgroud)
并删除结果.
| 归档时间: |
|
| 查看次数: |
359369 次 |
| 最近记录: |