MySQL报错:Column count doesn't match value count at row 1

     最近在使用MySQL时出现该错误 ”Column count doesn't match value count at row 1“,从字面上的理解是列字段与值不匹配,我当时使用的是 ” insert into film(film_id,title,description) values(2,'test','test trigger'); “语句向表里插入数据报了这个错,查了一些解决方法发现一般可以从以下几个方面慢慢排除可能的原因:

  • 插入列的字段数量是否和值的数量一致,比如上面语句3个列字段3个值,数量是一致的,显然不是这个原因;当然看问题不能太死,比如这句我稍微改一下 insert into film values('test','test trigger'); 这样也是没问题的,因为省略列关键字那么值应该全部按顺序列出,但有自增长或主键的列的值可以省略;
  • 数据库表中列的类型与插入的值的类型是否一致;比如我这里是int、char、varchar也没有问题;
  • 是否语句输入的时候带入了中文字符;这里我反复删掉重写了几次,确认没有这种问题,因此也不是这个原因;

上面三种是最基本的原因,一般这个错误就应该是这些原因导致的,但是检查我们的语句发现都没有问题,那究竟问题出在哪里了呢?不要急,首先我们要明确的一点是这种报错信息也是编写程序的人员提前定义好的,一定是触发了某种错误条件导致该该信息被显示出来,因此,按照这个思路我们可以相信出错的原因应该与上面列出的有关,但是可能不是插入语句本身出了错,那是不是与之关联的地方出错了呢?

        回到我写MySQL语句的环境中,我为了了解触发器工作的原理建了两张表并定义了一个触发器:

mysql> create table film(film_id int auto_increment primary key,title char(10),description varchar(20));
Query OK, 0 rows affected (0.02 sec)

mysql> create table film_text(film_id int auto_increment primary key,title char(10),description varchar(20));
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter $$
mysql>
mysql> create trigger ins_film after insert on film for each row
    -> begin
    -> insert into film_text values(new.film_id,new.title,new.description);
    -> end $$
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;

         这个到现在都是没有问题的,哪怕现在执行 ” ” insert into film(film_id,title,description) values(2,'test','test trigger'); “语句都是可以成功执行的,关键问题在于后面,后来我为了搞清楚触发器的执行顺序又重新创建了几个触发器但用的还是这两个表,要仅仅是这样那也不会出错,问题就出在我后来把表film_text表的最后一个字段删掉了,虽然表面上看来对后面没有影响,但是问题就在触发器ins_film身上,这个触发器绑定的是有3个字段的表film_text,此时我在执行插入语句 ”” insert into film(film_id,title,description) values(2,'test','test trigger'); “时表面上看什么问题都没有,但实际上触发了触发器ins_film,二这个触发器因为字段数量的不匹配就导致了上面出现的那种错误,因此,当我把触发器ins_film删除掉之后该语句就能正常插入了。

       这样,这个问题就解决了。

总结: 基本上遇到错误时一般都有有最根本的原因,了解到最根本的原因后剩下的就是按这个原因来进行逐个排除,除了表面的还要关注相关联的,比如我这个表面上表都没问题,但是相关联的触发器有问题,因此在排除问题时都要考虑,比如如果你是用别的语言调用的数据库接口,程序运行时报了这个错误,那你就应该根据这些基础原因来查找关联的原因,最终你会发现确实还是这些最基本的问题导致的,就像我最后找到的原因是数量不一致,只不过问题埋藏的深一点而已。

猜你喜欢

转载自blog.csdn.net/Coding___Man/article/details/85232580