MySQLエラー:Column count doesn't match value count at row 1

2465 ワード

最近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でも問題ありません.
  • 文入力時に中国語文字を持ち込んだかどうか.ここで私は何度も削除して書き直して、このような問題がないことを確認して、そのためこの原因ではありません;

  • 上の3つが最も基本的な原因で、一般的にこの間違いはこれらの原因によるはずですが、私たちの文をチェックしても問題はありません.それはいったい問題がどこにあるのでしょうか.焦らないでください.まず、このようなエラーメッセージもプログラムを作成した人が事前に定義したもので、間違い条件をトリガーして表示されたに違いありません.そのため、この考え方では、エラーの原因は上にリストされているものと信じることができますが、挿入文自体が間違っているわけではないかもしれません.それはそれに関連する場所が間違っているのではないでしょうか.
    MySQL文を書く環境に戻ると、トリガの動作原理を理解するために2つのテーブルを作成し、トリガを定義しました.
    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');「文はすべて成功して実行することができて、肝心な問題は後にあります.それから私はトリガの実行順序を明らかにするためにまたいくつかのトリガを再作成しましたが、この2つのテーブルを使っています.それだけでも間違いはありません.問題は私が後に表film_text表の最後のフィールドを削除したことです.表面的には後に影響はありませんが、問題は問題です.トリガins_filmには、このトリガが3つのフィールドを持つテーブルfilm_をバインドしています.text,ここで挿入文」insert into film(film_id,title,description)values(2,'test','test trigger');「時には表面的には何の問題もありませんが、実際にトリガins_filmがトリガーされました.
    これで、この問題は解決しました.
    まとめ:基本的にエラーが発生した場合、最も根本的な原因があります.最も根本的な原因を知った後、残りはこの原因によって一つ一つ排除することです.表面的なもの以外にも関連に注目しなければなりません.例えば、私のこの表面には表も問題ありませんが、関連するトリガには問題があります.そのため、問題を排除する際に考慮しなければなりません.例えば、他の言語で呼び出されたデータベースインタフェースで、プログラムがこのエラーを実行している場合は、これらの基礎的な原因に基づいて関連の原因を探す必要があります.最終的には、私が最後に見つけた原因が数が一致していないように、問題が埋蔵されている深さにすぎません.