MySQLエラー1136の修正方法:「列数が行1の値数と一致しません」
MySQLエラー1136とは?
MySQLでデータを挿入する際、ERROR 1136 (21S01): Column count doesn't match value count at row 1(列数が行1の値数と一致しません)というエラーに遭遇することがあります。これは、テーブルの列数に対してINSERT文で指定した値の数が合っていない場合に発生するエラーです。
特によくある原因のひとつが、AUTO_INCREMENT属性が設定された列(Idなど)の値を指定し忘れるケースです。実際には次のようなエラーが表示されます。
mysql> insert into DemoTable1353 values('Chris',23);
ERROR 1136 (21S01): Column count doesn't match value count at row 1解決方法
このエラーを解決するには、以下のいずれかの方法を使用します。
- AUTO_INCREMENT列を含むすべての列の値を明示的に指定する
- INSERT文で列名を明示し、AUTO_INCREMENT列は自動生成に任せる(推奨)
ここからは、後者の推奨される方法を実際の例で見ていきましょう。
テーブルの作成
まず、AUTO_INCREMENT列を含むテーブルを作成します。
mysql> create table DemoTable1353
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> Name varchar(20),
-> Age int,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.52 sec)Id列にはAUTO_INCREMENTが設定されており、値を指定しなくても自動的に連番が振られます。
レコードの挿入
次に、INSERT文で列名(Name, Age)を明示してレコードを挿入します。AUTO_INCREMENT列であるIdは指定していませんが、MySQLが自動的に値を生成してくれます。
mysql> insert into DemoTable1353(Name,Age) values('Chris',23);
Query OK, 1 row affected (0.30 sec)
mysql> insert into DemoTable1353(Name,Age) values('David',21);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1353(Name,Age) values('Bob',24);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1353(Name,Age) values('John',47);
Query OK, 1 row affected (0.11 sec)挿入結果の確認
SELECT文ですべてのレコードを表示して結果を確認しましょう。
mysql> select * from DemoTable1353;
実行すると、次のようにId列に自動的に連番が割り当てられていることがわかります。
+----+-------+------+ | Id | Name | Age | +----+-------+------+ | 1 | Chris | 23 | | 2 | David | 21 | | 3 | Bob | 24 | | 4 | John | 47 | +----+-------+------+ 4 rows in set (0.00 sec)
まとめ
エラー1136は、INSERT文で指定した値の数がテーブルの列数と一致しないときに発生します。AUTO_INCREMENT列が存在する場合は、INSERT文で列名を明示的に記述し、その列を省略するのが最も安全で確実な方法です。これにより、意図しないエラーを防ぎつつ、一意なIDの管理もMySQLに任せることができます。
-
MySQLで列の値ごとに「NO」の件数のみをカウントして返すクエリの書き方
MySQLでは、SUM()関数と条件式を組み合わせることで、グループごとに特定の値(この例では「NO」)が出現した回数だけをカウントできます。ここでは、ENUM型のカラムを持つテーブルを例に、「NO」の件数のみを集計する方法を具体的な手順とともに解説します。 1. テーブルを作成する まず、サンプル用のテーブルを作成します。isTopperカラムはENUM型で、「YES」または「NO」のいずれかの値を持ちます。 mysql> create table DemoTable1829 ( Name varchar(
-
MySQLで列が複数の値をすべて満たす行を選択する方法|GROUP BY・HAVING句の使い方
MySQLである列が「複数の値をすべて満たしている」行だけを抽出したい場合、IN()句と GROUP BY、そして HAVING 句を組み合わせることで実現できます。この記事では、具体的なサンプルを使いながら手順をわかりやすく解説します。1. サンプルテーブルを作成するまず、テスト用のテーブルを作成します。ここでは氏名(FirstName)と科目(Subject)を持つシンプルなテーブルを用意しました。mysql> create table DemoTable1885 ( FirstName varchar(20), Subject varchar(50)