重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
普通事务
成都创新互联公司服务项目包括鄂托克网站建设、鄂托克网站制作、鄂托克网页制作以及鄂托克网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,鄂托克网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到鄂托克省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
以 begin / start transaction 开始,commit / rollback 结束的事务。或者是带有保存点 savepoint 的事务。
2. 链式事务
一个事务在提交的时候自动将上下文传给下一个事务,也就是说一个事务的提交和下一个事务的开始是原子性的,下一个事务可以看到上一个事务的处理结果。MySQL 的链式事务靠参数 completion_type 控制,并且回滚和提交的语句后面加上 work 关键词。
3. 嵌套事务
有多个 begin / commit / rollback 这样的事务块的事务,并且有父子关系。子事务的提交完成后不会真的提交,而是等到父事务提交才真正的提交。
4. 自治事务
内部事务的提交不随外部事务的影响,一般用作记录内部事务的异常情况。MySQL 不支持自治事务,但是某些场景可以用 MySQL 的插件式引擎来变相实现。
前几日写存储过程,使用嵌套if语句的时候,碰到一个奇怪的问题,多方找原因无果。后发现是一个很sb的问题。。。
if condition1 then
if condition1.1 then
do something1.1;
else if condition1.2 then
do something1.2;
else -- 报错的地方
do something1.3;
endif;
else
do something2.2;
endif;
如上,else那里一直在报错。
使用了排除法,把else那块去掉,仍报错。
整个中间的if那段去掉,编译成功。
else if和else去掉,编译成功。
else if去掉,编译成功。
好吧,else if的问题。elseif应该是没有空格的!!!
排除法是个好方法,细心是个好习惯????????????。。。
描述的太模糊,我以下列假设为前提给你解答
员工表(t1):前提有 员工id,身份证号,是否在职标识,入职、离职时间
打卡记录表(t2):打卡人身份证号,打卡时间
select t1.员工ID,t1.员工姓名,t1.员工身份证号码,t2.打卡时间
from t1 join t2 on t1.员工身份证号码 = t2.员工身份证号码
where t1.在职标识 = '在职'
AND t2.打卡时间 = t1.入职时间
不可以哦,这不是MYSQL的问题,数据库都有这个规定:不允许UPDATE的子查询里面有被UPDATE的那个表。
我一般采取两种方法,一是利用SQL文本:
SELECT CONCAT("UPDATE RES_OBJECT SET MULTISELECT_ID=",
B.MULTISELECT_ID,"WHERE RES_ID=",A.RES_ID,";")
INTO OUTFILE ABC.SQL
FROM RES_OBJECT A,RES_OBJECT B
WHERE B.RES_ID=A.PARENT_NODE_RES_ID)
AND (RES_OBJECT.MULTISELECT_ID IS NULL OR RES_OBJECT.MULTISELECT_ID=0);
SOURCE ABC.SQL;
另外一种方法是利用临时表:
SELECT B.MULTISELECT_ID,A.RES_ID
FROM RES_OBJECT A,RES_OBJECT B
WHERE B.RES_ID=A.PARENT_NODE_RES_ID)
AND (RES_OBJECT.MULTISELECT_ID IS NULL OR RES_OBJECT.MULTISELECT_ID=0)
INTO TEMP TABLE TMP;
UPDATE RES_OBJECT SET MULTISELECT_ID=
(SELECT MULTISELECT_ID FROM TMP WHERE TMP.RES_ID=RES_OBJECT.RES_ID)
WHERE EXISTS
(SELECT MULTISELECT_ID FROM TMP WHERE TMP.RES_ID=RES_OBJECT.RES_ID);
进行嵌套查询的时候子查询出来的的结果是作为一个派生表来进行上一级的查询的,所以子查询的结果必须要有一个别名
例如:把mysql语句改成:select
count(*)
from
(select
*
from
……)
as
total;
问题就解决了,虽然只加了一个没有任何作用的别名total,但这个别名是必须的