记录一个因为SQL连接查询的导致空指针的异常
在业务系统中有文件信息表和文件存储表A,因为代码逻辑处理是删除文件信息只做标记处理,而删除文件存储表的时候是直接删除了数据,然后通过A LEFT JOIN B ON A.id = B.id 导致查询数据含有空数据,导致后续程序代码中空指针异常。
解决方法:
- 查询后加上非空判断
- 更换查询的主表,原先是A left join B, 修改为B left join A,或者改为右连接
- 使用内连接inner join
内连接:只有包含
外连接:外连接会保留所有的悬浮组,悬浮组其他字段则为NULL
左外连接:保留主表A也就是左边表的悬浮组 A LEFT JOIN B
右外连接:保留主表B也就是右边表的悬浮组 A RIGHT JOIN B
外连接的ON 过滤的是 次表的条件,主表的过滤条件应该写在where中
CREATE TABLE `file_info` (
`id` int(11) DEFAULT NULL,
`file_name` varchar(10) DEFAULT NULL,
`file_size` varchar(10) DEFAULT NULL,
`is_delete` varchar(2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `file_store` (
`id` int(11) DEFAULT NULL,
`file_path` varchar(10) DEFAULT NULL,
`file_data` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
file_info
file_store
id=3的文件记录file_info被标记,文件数据file_store被删除
1. select * from file_info info left join file_store store on info.id = store.id
-- 只保留了主表file_info的悬浮组
2. select * from file_info info left join file_store store on info.id = store.id WHERE store.id != ''
使用where对主表进行过滤
3. select * from file_store store left join file_info info on info.id = store.id
-- 因为要查询的是file_store的数据,所以将这张表作为主表,或改为右连接
select * from file_info info right join file_store store on info.id = store.id
4. 使用内连接,无论谁做主表都不会产生悬浮组,结果一致,只是字段顺序不同
select * from file_info info inner join file_store store on info.id = store.id
select * from file_store store inner join file_info info on info.id = store.id