• 締切済み

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 長文大変申し訳ありません。よろしくお願いします。

  • aneja
  • お礼率93% (379/405)
  • MySQL
  • 回答数3
  • ありがとう数5

みんなの回答

  • 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

  • SQLite(3.2.2)でauto_increment

    今、SQLiteを利用してつまづいています。 バージョンは3.2.2です。(Linux) MySQL、PostgreSQLの知識はあります。 プライマリーキー(id)にシリアルを作成しようと思い、http://cl.pocari.org/2006-02-12-1.html を参考にしながらテーブルを作りました。 CREATE TABLE bbs ( id INTEGER UNSIGNED NOT NULL PRIMARY KEY, name VARCHAR(255) NOT NULL, message TEXT NOT NULL, last_update TIMESTAMP NOT NULL ); このbbsテーブルに対し、 INSERT INTO bbs (name,message,last_update) VALUES ('name','message','2008-04-03 12:11:00'); というクエリを発行すると 「SQL error: bbs.id may not be NULL」 とういエラーが返ってきます。 確かに、bbsテーブルのidカラムは「NOT NULL」制約があるのでエラーが正しいとは思うのですが、参考URLのauto_incrementの作成方法には、auto_incrementにしたいカラムをPRIMARY KEYでやればできる、のような事が書いてあったので、よく分かりません。 バージョンの問題なのか、クエリに誤りがあるのか分かる方おられましたら解答お願いします。 また、auto_incrementなカラムの作成方法も一緒に教えていただけたら幸いです。 宜しくお願いします。

  • ODBC経由でMySQL5.0に auto_increment属性などを付加したテーブルを作成したい

    ODBC経由でMySQL5.0に auto_increment属性など付加した以下のテーブルを作成したいのですがODBCのSQL文はどう書けばよいのでしょうか? DROP TABLE IF EXISTS test; CREATE TABLE IF NOT EXISTS test ( a1 int(11) NOT NULL auto_increment, b1 enum('public','group','private') NOT NULL default 'public', c1 date NOT NULL default '0000-00-00', d1 mediumtext NOT NULL, PRIMARY KEY (`a1`) ) TYPE=MyISAM AUTO_INCREMENT=1 ; よろしくお願いします。

  • MySQL insert文に関するエラーについて

    ○質問の主旨 MySQLのデータベースにテーブルを作ってinsert文で データを追加しようとするとシンタックスエラーが出ます。 SQL文が間違っているのかと思いGoogle検索や本で調べたりしましたが、 なぜ文法エラーが発生するのか分かりません。 エラーと対処方法をご存知の方がいらっしゃいましたらご教示願います。 ○質問の補足 // usersテーブル create table users ( id int not null auto_increment primary key, created datetime not null, modified datetime not null, username varchar(255), password varchar(40) ); desc users; +----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | created | datetime | NO | | NULL | | | modified | datetime | NO | | NULL | | | username | varchar(255) | YES | | NULL | | | password | varchar(40) | YES | | NULL | | +----------+--------------+------+-----+---------+----------------+ insert into users (created, modified, username, password) values (now(), now(), 'test1', 'test1'), (now(), now(), 'test2', 'test2') ); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 3

    • ベストアンサー
    • MySQL
  • auto_incrementを任意の数字から開始するには

    次のようなテーブルで入力するとidが1~始まりますが、 これを1000~開始する方法が分かりません、ご教授お願いします。 CREATE TABLE addressbook ( id smallint(4) UNSIGNED NOT NULL auto_increment, name1 varchar(20) default NULL, birthday date default NULL, PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=sjis;

    • ベストアンサー
    • MySQL
  • MySQLのテーブル設計で迷っています(桁数)

    MySQLのテーブル設計で迷っています。 クリエイト文のカッコの中は桁数を表しているのでしょうか?それともバイト数でしょうか?桁数であれば、それぞれの型で何桁まで設定できますでしょうか? int型のnoを18桁に変更したいのですが、調べているうちに迷ってしまいました。 型 バイト 最小値 最大値 TINYINT 1 -128 127 SMALLINT 2 -32768 32767 MEDIUMINT 3 -8388608 8388607 INT 4 -2147483648 2147483647 BIGINT 8 -9223372036854775808 9223372036854775807 CREATE TABLE `user` ( `no` int(8) unsigned NOT NULL auto_increment, `id` varchar(24) NOT NULL default '', `email` varchar(255) NOT NULL default '', `reg_date` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`no`) ) TYPE=MyISAM;

    • ベストアンサー
    • MySQL
  • DBでAUTO_INCREMENTのフィールドの最新の数値を知るには

    PHP+MySQLで開発しています。 自らがDBテーブルに書き込んだレコードの、AUTO_INCREMENT指定してある項目に設定された数値を取得したいのですが、どのようにすればいいのでしょうか。 DB指定 CREATE TABLE test( no INT NOT NULL AUTO_INCREMENT, comment TEXT, PRIMARY KEY(no) ); PHP書き込み $sql = "INSERT INTO test(comment)VALUES('いろは')"; $results = mysql_query($sql,$dbid); このとき、テーブルtestのフィールドnoに設定された数値を知るために、 今はわざわざSQL select MAX(no) from test を発行しています。 これですと、確実性に欠けますし、冗長な気がします。 他に何か効率的な方法があるような気がしますので、 質問いたしました。 よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • JDBCを使ってdate型へのINSERTはできますか?

    JDBCを使ってOracleへ接続し、DBへデータを挿入したいのですが、 日付型のデータがどうしてもうまく挿入できません。 jsp + Servlet + Bean で開発しています。 使っているテーブルは CREATE TABLE USERS (     USERID     VARCHAR2(10) NOT NULL,     PASSWORD  VARCHAR2(10) NOT NULL,     NAME      VARCHAR2(50) NULL,     SEX       VARCHAR2(5)  NULL,     BIRTHDAY   DATE       NULL,     PRIMARY KEY (USERID, PASSWORD) ) という風な型で、定義しています。 DBへのINSERT処理は、Beanで行っています。 以下のINSERT文を実行したのですが、うまくINSERTできませんでした。 String sqlQuery = "INSERT INTO USERS (USERID, PASSWORD, NAME, SEX, BIRTHDAY)" + "VALUES ('use', 'pass', 'ナマエ', '女性', '1980/06/05')" int numOfUpdate = statement.executeUpdate(sqlQuery); ちなみに、この中のdate型で定義している「BIRTHDAY」を除いたINSERT文 String sqlQuery = "INSERT INTO USERS (USERID, PASSWORD, NAME, SEX)" + "VALUES ('use', 'pass', 'ナマエ', '女性')" int numOfUpdate = statement.executeUpdate(sqlQuery); だとうまくINSERTできます。 sql*plusを使って直に書くと、両方うまくINSERTできました。 ●その後に、「BIRTHDAY」をdate型からVARCHAR2(10)へ定義し直し、  DBを作り直して実行した所、うまくINSERTできるようになりました。 なぜ「date型」だとINSERTできず、「VARCHAR2型」だとINSERTできるのか、 知っている方がおられましたら、ぜひ教えて頂きたいです。

    • ベストアンサー
    • Java
  • テーブルにINSERTができません(MySQL)

    独学でPHP,MySQLを勉強中です。 とあるトレーディングカードの出品サイトを作成中ですがデータのINSERTがうまくいきません。 経験も浅いので何か大きく基本をはずしているような気がしています。どなたかご教授ください。 ●登録完了ページ <?php header("Content-Type:text/html;charset=Shift_jis"); error_reporting(4); session_start(); /*SESSIONで送られてきた情報を受け取る*/ $item_f=$_SESSION['item_f']; $myID=$_SESSION['myID']; $s_code=$_SESSION['s_code']; $TNO=""; $today = date("Y/m/d H:i"); /*DBに登録*/ $db = mysql_connect("localhost", "root", "root")or die ('DB Connection Error= '. mysql_error()); mysql_select_db("regist_test_db", $db)or die ('DB Connection Error= '.mysql_error()); $rs = mysql_query("SET character set SJIS", $db); mysql_query("insert into regist_test (time,myID,s_code,CID0) values ('$today','$myID','$s_code','$item_f[0][0]')" ,$db); mysql_query("commit"); session_destroy(); ?> <html> <head><title>トレードサイトほげほげ</title></head> <p>登録が完了しました。</p> <p>トレードが成立すると良いですね!</p> <a href="index.php">検索ページへ</a> </body> </html> ●テーブル作成 regist_test_db内 create table regist_test ( TNO int auto_increment primary key, time datetime not null, myID varchar(10) not null, s_code varchar(10) not null, CID0 varchar(5) not null, ); ●補足 $_SESSION['item_f']は二次元配列で、[0][0]から[4][6]までありますが、この場では割愛しています。 試しに、 echo "today=".$today."<br>"; echo "myID=".$myID."<br>"; echo "s_code=".$s_code."<br>"; echo "item_f[0][0]=".$item_f[0][0]."<br>"; echo "item_f[0][2]=".$item_f[0][2]."<br>";  :  : と表示させることはできるので、SESSIONでデータは渡っているようです。 この登録完了ページがひらいたあと、MySQL Command Line Clientで select * from regist_test; としてもEmpty setとでてしまいます。 すみませんがお分かりの方アドバイスお願いします。

    • ベストアンサー
    • PHP
  • 見たことのないINSERT文

    お世話になります。 他人の書いたSQLを解析して以下のようなコードを見つけました。 CREATE TABLE OYA ( ID NUMBER NOT NULL, NAME VARCHAR2(10) ) / CREATE TABLE KO ( ID NUMBER NOT NULL, OYA_ID NUMBER NOT NULL, NAME VARCHAR2(10) ) / INSERT INTO ( SELECT ID ,OYA_ID ,NAME FROM KO WHERE EXISTS ( SELECT ID FROM OYA WHERE NAME LIKE '%1' ) ) VALUES ( 1 ,1 ,'KODOMO-1' ); INSERT文でテーブル名を指定するかわりにSELECT文を指定しています。 SELECT INSERT文は知っていますが、このような表記は初めてです。 (文法エラーにならないのに驚きました) おそらく意図するところは、ある条件に一致したOYAが存在する場合に、KOをインサートするのだと思いました。 実際は、OYAがなくてもINSERTは実行されてしまいますが。。。 このような表記のINSERT文の説明が書いてあるサイトをご存知の方がいらっしゃいましたら、よろしくお願いします。

  • NOTNULL制約について

    MYSQL ver4.0.20a 下記のようにNOTNULL制約を付けてテーブルを作成するのですが、 デフォルト値が勝手に設定されてしまいます。 CREATE TABLE TEST_01 ( NO int(8) NOT NULL auto_increment, STATUS int(1) NOT NULL, TOUROKUBI date NOT NULL, MEMO varchar(200) NOT NULL, PRIMARY KEY (NO) INT型だと 0 varchar型だと '' date型だと 0000-00-00 インサートの時に値がNULLの場合、SQLエラーを返してほしいのですが、 デフォルト値が設定されている為、登録されてしまいます。 本当はNOTNULL制約で、DBにチェックを任せたいのですが・・・ どなたかご存知の方、教えてください。 お願いします。

    • ベストアンサー
    • MySQL