最近碰到的几个问题 Column count doesn’t match value count at row 1

最近的开发过程中碰到了几个问题,都是知道不知道的类型,记录一下,避免下次再犯。

问题1 在程序中和MySQL做交互的时候,提示这个错误,

Column count doesn’t match value count at row 1
从字面的意思,应该很直白了,一般出现在INSERT语句,指定的字段数据和数据库表的字段类型不同。

场景1 不指定具体插入的字段名称,但是实际在VALUES中的个数和表字段个数不同,

INSERT INTO table_name
VALUES (value1, value2, value3,…)
这就是为什么我们在规范中要求INSERT必须指定要插入的具体字段名称。

改为字段和VALUES字段一一对应,这个不香么?

INSERT INTO table_name (column1, column2, column3,…)
VALUES (value1, value2, value3,…)
场景2 INSERT语句指定了具体的字段名称,但是个数和VALUES不同,这就是考眼力了,

INSERT INTO table_name(col_name1, col_name2, col_name3) VALUES(‘value1′,’value2’);
我的错误就是这场景,因为调整VALUES中某个值的时候多删了一个字段。

场景3 书写错误

其实和2很相近,例如多写了个”,”。

问题2 从MySQL集群环境用mysqldump导出导入数据的时候,提示这个错误,

@@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty
他的意思是,当前GTID_EXECUTED参数已经有值,而从集群导出来的dump文件中包含了SET @@GLOBAL.GTID_PURGED的操作。

解决方案1 reset master

这个操作可以将当前库的GTID_EXECUTED值置空。

解决方案2 设置-set-gtid-purged=off

在dump导出时,添加–set-gtid-purged=off参数,避免将gtid信息导出,例如,

mysqldump -uroot -p –set-gtid-purged=off test > test.sql

问题3 MySQL导出的时候,一般用什么参数?

这个咨询了老杨,这是常用的参数,

mysqldump –single-transaction –master-data=2 –all-databases -E -R –triggers –set-gtid-purged=off
–single-transaction,为了不进行全局的锁表,但同时能保证数据一致性,加这个参数。

–master-data=2,master-data会将二进制日志的位置和文件名写入到输出中,2则会将change log行注释。

-E,指的是导出event,我理解就是Oracle中的job定时任务。

-R,导出存储过程和自定义函数。

–triggers,导出触发器,默认会导出,可使用–skip-triggers不导出。

如果是单机,一般用–single-transaction,可能就够了,如果是测试数据,或无业务请求,即使用lock-all-tables都可以。

近期更新的文章:

《Linux系统中的kill -9和-15有什么区别?》

《Linux系统中的kill -0有什么作用?》

《主键和唯一约束的索引肯定唯一?》

《小白学习MySQL – 查询会锁表?》

《误操作怎么办?试试这个神器-Log Miner》

文章分类和索引:

《公众号700篇文章分类和索引》

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/423527.html

联系我们
联系我们
分享本页
返回顶部