mysql update Column count doesn't match value count at row 1

如山图

错误的意思就是 进行UPDATE的时候,给定的列名和参数数量不符

排查了很久,一直纠结在MySqlParameter的处理上,结果发现语句

1

UPDATE `trades` SET `buyernick`=@buyernick,`sellerid`=@sellerid,`receivername`=@receivername,`receivermobile`=@receivermobile,`receiverstate`=@receiverstate,`receivercity`=@receivercity,`receiverarea`=@receiverarea,`receiveraddress`=@receiveraddress,`payment`=@payment,`paytime`=@paytime,`payway`=@payway,`createtime`=@createtime,`modifiedtime`=@modifiedtime,`sellermemo`=@sellermemo,`buyermessage`=@buyermessage,`postfee`=@postfee,`status`=@status,`hasrefund`=@hasrefund,`localstatus`=@localstatus,`platform`=@platform WHERE `Tid`=88166832817679985

  

和MySqlParameter内的parameters的对应没有问题,出去溜达了一圈突然想起来

MySqlCommand 在 ExecuteNonQuery 的时候 跟MYSQL的语句执行时一样,如果遇到触发器的错误,会返回触发器的错误

所以这个提示并不一定代表当前的UPDATE语句有问题.

而可能出现在触发器上  果然

一条触发器 

1

2

3

if new.modifiedtime >old.modifiedtime then

insert into tradessnaps select from trades where tid=old.tid;

end if

  

trades表更新后执行

于是查看 

1

tradessnaps 表<br><br>发现

1

 如上图,这条触发器是在订单更新后执行了一个订单的快照表插入工作,而快照表要插入的数据的来源是通过SELECT*得来,所以得到的结果是全部的列的值 而 tradessnap表的列数量要比trades少,没有打到键值的一一对应标准.

所以 

1 当出现此错误的时候,检查自己要操作的目标表有没有触发器引发了错误(其他错误也可能因为触发器错误引起),所以触发器要保证绝对的准确性和稳定性,不然不好排查

2 类似 

1

insert into tradessnaps select from trades where tid=old.tid; <br>这样的语句,一定要确定  原表和目标表列一致性<br><br>

转载自:https://www.cnblogs.com/afterwards/p/7822481.html

猜你喜欢

转载自blog.csdn.net/u013584315/article/details/93894517