mysql存储过程 if else是一个事务吗? if(exists(select id from test where name='')) then update ....; else insert into ...; end if; 第一行where 没有包含主键或者唯一索引 ,因该会用表锁,这个锁什么时候释放呢? 需不需要显示开启事务 提交事务?
时间: 2023-05-18 11:02:50 浏览: 66
MySQL存储过程中的if else语句并不是一个事务,它只是一个条件判断语句。在您提供的代码中,如果where子句没有包含主键或唯一索引,那么MySQL会使用表锁。这个锁会在事务提交或回滚时释放。如果您需要在存储过程中使用事务,您需要显式地开启事务并提交或回滚事务。
相关问题
SELECT * from T1 where Exists select * from T2 where T1.id= T2.id
您的 SQL 查询语句存在语法错误,应该将 `select * from T2 where T1.id= T2.id` 用括号括起来,表示这是一个子查询,如下所示:
```
SELECT * FROM T1 WHERE EXISTS (SELECT * FROM T2 WHERE T1.id = T2.id);
```
这个查询语句的意思是,对于 T1 表中的每一行记录,都去 T2 表中查找是否存在与 T1 表中的记录具有相同 id 的记录。如果存在,则返回 T1 表中的这一行记录。
需要注意的是,这个查询语句的效率可能不太高,如果 T1 和 T2 表都非常大,可以考虑使用其他更高效的查询方式来实现相同的功能。
SELECT a.id FROM a WHERE NOT EXISTS (SELECT 1 FROM b WHERE a.id = b.id)这样查询出来是空
如果执行该SQL语句后查询结果为空,可能是因为表a中的所有记录都在表b中存在对应的记录。或者表b中没有任何记录。
可以通过下列两种方式来排查问题:
1. 检查表a和表b中的数据是否存在符合条件的记录。
2. 尝试使用 INNER JOIN 来查询表a和表b中的数据,看是否存在符合条件的记录。
例如,可以尝试执行下列SQL语句来检查表a和表b中的数据是否存在符合条件的记录:
```
SELECT a.id FROM a WHERE NOT EXISTS (SELECT 1 FROM b WHERE a.id = b.id);
SELECT id FROM a WHERE id NOT IN (SELECT id FROM b);
```
如果上述SQL语句的结果为空,那么可能是表a和表b中的数据不符合条件,可以尝试插入符合条件的数据后再次执行该SQL语句进行验证。