读取备案数据写入数据库,备案状态为0
如果备案操作成功,则状态为1,失败则为2
如何在第二次插入已经备案的数据到表里并满足以下插入条件:
1、账号相同 状态为2 则不插入数据,更新数据,将状态更新为1
2、账号相同 状态为1 则不插入数据,也不更新数据
你的表有没有建唯一索引,如果没有的话,无法实现。如果有的话可以用ON DUPLICATE KEY UPDATE
如 test1表中code字段为唯一索引,假如用code表示你说的账号,status表示状态,就可以用以下语句实现你说的
1、账号相同 状态为2 则不插入数据,更新数据,将状态更新为1
2、账号相同 状态为1 则不插入数据,也不更新数据
INSERT INTO test1 (code, name,status)
VALUES ('001', 'test1',0)
ON DUPLICATE KEY UPDATE status=if(status=2,1,status)
你这个实际上是想要根据不同的条件合并数据,简单写一个:
INSERT INTO table_name(col1, col2, ...)
VALUES (val1, val2, ...)
ON DUPLICATE KEY UPDATE
col1 = val1,
col2 = val2,
...;
首先,“账号”字段应该是主键。状态为 1 和 2 都可以执行更新操作,因为状态 1 更新之后数据还是原来的 1,如果不是,可以使用 col1 = case input_status when 1 then col1 else val1 来区分状态1(更新为col1,也就是不更新)和状态2(更新为val1)。
业务的判断在代码中处理,真正要执行的sql才在数据库中实现。
难道不是用update吗?
我理解你怕出现并发是因为备案的数据里有账号相同的数据?
触发器……
建议直接在数据库中自定义个函数吧,然后调用自定义的函数,问题就可以解决了
用游标,把备案的数据读出来,然后遍历,查询数据出来,比对状态,如果1就不做任何操作,如果状态2就更新。和代码的for循环一样。
读一条查一条。游标如下,具体的可以百度学习一下,里面逻辑改一下就可以
--创建游标
declare cur cursor for select name,count from store where name = 'iphone';
--指定游标循环结束时的返回值
declare continue HANDLER for not found set done = true;
--设置初始值
set total = 0;
--打开游标
open cur;
--开始循环游标里的数据
read_loop:loop
--根据游标当前指向的一条数据
fetch cur into n,c;
--判断游标的循环是否结束
if done then
leave read_loop; --跳出游标循环
end if;
--获取一条数据时,将count值进行累加操作,这里可以做任意你想做的操作,
set total = total + c;
--结束游标循环
end loop;
--关闭游标
close cur;
初始化备案数据备案状态为0,备案操作成功状态为1,备案操作失败状态为2.
如何在第二次插入已经备案的数据到表里并满足以下插入条件:
1、账号相同 状态为2 则不插入数据,更新数据,将状态更新为1
2、账号相同 状态为1 则不插入数据,也不更新数据
其实并不是在进行插入操作,二是一个更新操作,且只更新的是前面备案操作失败的数据。实现思路可参照:
1.备案数据列表提供一个备案操作功能,根据备案状态显示,状态为1(备案成功)的不显示备案操作按钮,未备案或备案失败的数据在列表上显示备案操作按钮;
2.对于未备案成功或者未备案的数据进行备案操作及时你所描述的二次插入,只需要在进行备案操作的时候更新该数据和状态;状态为1的即是备案成功的数据,不进行操作。