• 締切済み

AUTO_INCREMENTのあるテーブルにinsertできません(長文)

mysql5.0.27(RedhatLinux 9)です。 属性のひとつがAUTO_INCREMENTになっているテーブルhogeに、データをinsertしたいのですが、「コラムの数が合致しない」というエラーで、insertできません。 Webをいろいろ漁って、AUTO_INCREMENTの属性は明示的に指定しないようだと理解しました。冗長で申し訳ないのですが、エラーが出た状態のものを、そのまま掲載させていただきます(テーブル名や属性名のみ変更しました)。 状態をまとめると、以下のようになります。 ・下記のテーブル定義で、テーブルは普通にcreateできた。 ・descで確認しても、ちゃんとテーブルはできているよう。 ・下記のinsert文で、その下のエラーメッセージが出て、データを登録できない。 ・どうみても、コラム数は合っている(と思う)。 ・下記のテーブル定義の属性数を適当に減らす(id, item1, item4, item6くらいにする)と、エラーが出ずデータがちゃんとinsertできる。 私はなにか、とんてもない勘違いをしているのでしょうか?かなりの時間試行錯誤しているのですが、一向にわかりません。。。 ===== テーブル定義 ===== CREATE TABLE hoge ( id MEDIUMINT UNSIGNED AUTO_INCREMENT NOT NULL, item1 VARCHAR (64) NOT NULL, item2 VARCHAR (64) NOT NULL, item3 VARCHAR (32) NOT NULL, item4 VARCHAR (64), item5 VARCHAR (64), item6 VARCHAR (16) NOT NULL, CONSTRAINT PK_HOGE PRIMARY KEY (id) ) type=innodb; CREATE INDEX IDX_HOGE_1 ON hoge(item1); CREATE INDEX IDX_HOGE_2 ON hoge(item2); CREATE INDEX IDX_HOGE_3 ON hoge(item3); CREATE INDEX IDX_HOGE_4 ON hoge(item4); CREATE INDEX IDX_HOGE_5 ON hoge(item6); ===== descの出力 ===== +---------------------+-----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------------+-----------------------+------+-----+---------+----------------+ | id | mediumint(8) unsigned | NO | PRI | NULL | auto_increment | | item1 | varchar(64) | NO | MUL | | | | item2 | varchar(64) | NO | MUL | | | | item3 | varchar(32) | NO | MUL | | | | item4 | varchar(64) | YES | MUL | NULL | | | item5 | varchar(64) | YES | | NULL | | | item6 | varchar(16) | NO | MUL | | | +---------------------+-----------------------+------+-----+---------+----------------+ 7 rows in set (0.00 sec) ===== insert文 ===== insert into hoge (item1, item2, item3, item4, item5, item6) values ( 'data1','data2', 'data3', 'data4', 'data5', 'data6'); ===== エラーメッセージ ===== ERROR 1136 (21S01) at line 1: Column count doesn't match value count at row 1 長文大変申し訳ありません。よろしくお願いします。

みんなの回答

  • mooboogie
  • ベストアンサー率68% (28/41)
回答No.3

insert文で、auto incrementカラムへ、NULLを挿入すれば問題ありません。

aneja
質問者

お礼

ご回答ありがとうございます。仰るとおり、NULLを明示的にinsertしてもいけますね。(エラーが出ていない状態の時に確認しました) お時間がありましたら、No.1の方への補足をお読みになってください。

  • la_pure
  • ベストアンサー率72% (18/25)
回答No.2

こんにちわ。 自分も試してみました。 そのままコピペして使いました。 ===テーブル作成 mysql> CREATE TABLE hoge ( -> id MEDIUMINT UNSIGNED AUTO_INCREMENT NOT NULL, -> item1 VARCHAR (64) NOT NULL, -> item2 VARCHAR (64) NOT NULL, -> item3 VARCHAR (32) NOT NULL, item5 VARCHAR (64), item6 VARCHAR (16) NOT NULL, CONSTRAINT PK_HOGE PRIMARY KEY (id) ) type=innodb; -> item4 VARCHAR (64), -> item5 VARCHAR (64), -> item6 VARCHAR (16) NOT NULL, -> CONSTRAINT PK_HOGE PRIMARY KEY (id) -> ) type=innodb; Query OK, 0 rows affected (0.14 sec) =====index mysql> CREATE INDEX IDX_HOGE_1 ON hoge(item1); Query OK, 0 rows affected (0.08 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> CREATE INDEX IDX_HOGE_2 ON hoge(item2); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> CREATE INDEX IDX_HOGE_3 ON hoge(item3); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> CREATE INDEX IDX_HOGE_4 ON hoge(item4); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> CREATE INDEX IDX_HOGE_5 ON hoge(item6); Query OK, 0 rows affected (0.05 sec) Records: 0 Duplicates: 0 Warnings: 0 =========desc mysql> desc hoge; +-------+-----------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-----------------------+------+-----+---------+----------------+ | id | mediumint(8) unsigned | | PRI | NULL | auto_increment | | item1 | varchar(64) | | MUL | | | | item2 | varchar(64) | | MUL | | | | item3 | varchar(32) | | MUL | | | | item4 | varchar(64) | YES | MUL | NULL | | | item5 | varchar(64) | YES | | NULL | | | item6 | varchar(16) | | MUL | | | +-------+-----------------------+------+-----+---------+----------------+ 7 rows in set (0.00 sec) ======insert mysql> insert into hoge (item1, item2, item3, item4, item5, item6) -> values ( 'data1','data2', 'data3', 'data4', 'data5', 'data6'); Query OK, 1 row affected (0.01 sec) 普通にできました! バージョンの違いですかね。 私は4.0系です。 mysql> select version(); +-----------+ | version() | +-----------+ | 4.0.27 | +-----------+ 1 row in set (0.01 sec) 5.0系のauto_incrementの扱いとか調べるとよいかもしれないですね。 URLはMysqlユーザ会のアドレスです。過去ログ探ってみるとあるかもしれません。 (解答なくて申し訳ない)

参考URL:
http://www.mysql.gr.jp/
aneja
質問者

お礼

ご回答どうもありがとうございます。No.1の方の補足に書いたのですが、ただいまドツボにはまっております。どうもバージョンじゃないようです。もっと根本的なポカミスかも…。お時間がありましたら、No.1の方の補足をごらん下さい。 あと参考URLをありがとうございました。激似の質問はありましたが、お約束の「,」が「.」でした。

  • calltella
  • ベストアンサー率49% (317/635)
回答No.1

試しに item1 VARCHAR (64) NOT NULL, item2 VARCHAR (64) NOT NULL, item3 VARCHAR (32) NOT NULL, item4 VARCHAR (64), item5 VARCHAR (64), item6 VARCHAR (16) NOT NULL, ↑全て同じにしてみたらいかがでしょうか? item1 VARCHAR (64) NOT NULL, item2 VARCHAR (64) NOT NULL, item3 VARCHAR (64) NOT NULL, item4 VARCHAR (64) NOT NULL, item5 VARCHAR (64) NOT NULL, item6 VARCHAR (64) NOT NULL, これでINSERTできるのならデータかテーブル構成かどちらかです。

aneja
質問者

お礼

こんにちは、早速のご回答ありがとうございます。お礼が遅くなりすみません。補足で説明いたしますが、今日はますます理解しがたい挙動をされました(T_T) 相変わらず同じエラーが出た状態で、ご助言の方法を試してみましたが、やはり状況は変わりませんでした。自分でも明確に説明できず、申し訳ありません。もっと別の、基本的な原因かも知れませんが、なんかもやもやしています。

aneja
質問者

補足

以下の順番で確認して、ドツボにはまったぽいです…(泣) 1)質問に書いた通りのもので試す → エラー出ず普通にできる 2)テーブル名、属性名、データは質問のために書き換えたものなので、それらを自分の環境で使用している名前に戻す(viの一括置換を使ったから、「,」が「.」になったりはないはず:何度も確認もしたし) → 質問のエラーが出る 3)置換したところを1つずつ戻したりして確認していき、テーブル名のみ置換しない状態(質問の「hoge」のまま)で試す → エラーが消えた! 4)何故テーブル名がまずいのか?テーブル名もごく普通のアルファベット4文字です(AAAAとします)。思い当たることといえば、同じ名前で別「DB」が既にある(関係ないとは思うんですが)。不可解だが、テーブル名を「AAAA2」とし、試す → できた 5)まったく不可解だが、テーブル名を、別DBにもないマトモな名前「AAAA_BBBBB」にし、再度試す → できた 6)1から5は、insert1つのみの手打ち。よっしゃできるじゃんと自信を持ち、テーブル名「AAAA_BBBBB」で本来の大量スクリプトをたたく → またエラーorz この間、スキーマはいじらず、いじったのはテーブル名のみ。恥をさらすようで申し訳ありませんが、どんな手がかりでも結構ですので、思いあたることがあれば、お願いいたします。

関連するQ&A