こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PHP/MySQL INSERT文について。

PHP/MySQL INSERT文について。

こんばんは。
PHP・MySQLでデータベースへデータの書き込みを試行錯誤しております。
そこで一つどうしても解決出来ない問題(謎)があるので質問させて頂きます。

簡易的な質問内容としては
全てのカラムに対する値の挿入は可能なのに
カラムを指定して値を挿入しようとしたらエラーが出ます。

データベースの設定はテーブル名【TESTtable】
フィールド種別NULL属性/その他
AAAint(6)NoUNSIGNED ZEROFILL / auto_increment
BBBint(4)Yes
CCCint(4)Yes
DDDint(4)Yes

PHPでのSQL実行文をしてはの記述としては(値は全て可変で数値を代入します。)

INSERT INTO TESTtable VALUES (last_insert_id(),50,600,50)
とした場合は問題無くテーブルに書き込みされますが
カラムを指定して
INSERT INTO TESTtable (AAA,BBB,CCC,DDD) VALUES (last_insert_id(),50,600,50)
とした場合、書き込みが行われません。
INSERT INTO TESTtable ('AAA','BBB','CCC','DDD') VALUES (last_insert_id(),50,600,50)
INSERT INTO TESTtable (AAA,'BBB','CCC','DDD') VALUES (last_insert_id(),50,600,50)
INSERT INTO TESTtable ('AAA','BBB','CCC','DDD') VALUES (last_insert_id(),'50','600','50')
等、色々試してみましたが不可能でした。

カラムAAAはauto_incrementにりますので毎回書き込みされますが
BBB、CCC、DDDは書き込みが不要の場合もあるので
カラム指定の書き込みは必須となるのですが・・・行き詰ってしまいました・・・。

ご教授頂ければ幸いです。
どうぞ、宜しくお願い致します。

投稿日時 - 2010-06-22 04:18:00

QNo.5986071

困ってます

質問者が選んだベストアンサー

いまいち何をしたいのかわかりません。
AAAがAUTOINCREMENTなら、わざわざlast_insert_id()を指定しなくてよいのでは?

INSERT IGNORE INTO `TESTtable`(`BBB`,`CCC`,`DDD`) VALUES(50,600,50)

とすればいいような気がしますが?
※IGNOREはエラー回避のためにつけています。基本的にはなくても動きます
※テーブル名、カラム名はバッククォートで囲むのがMySQLのルールです

投稿日時 - 2010-06-22 11:07:47

ANo.1

このQ&Aは役に立ちましたか?

20人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

last_insert_id() は、接続後初めて実行するときは、0なので、
 → AUTO_INCREMENT カラムに0 の値を挿入 → 自動採番実行
となります。
2回目以降は、+1 しないと既に存在する値を入れようとすることになりduplicate error になる。エラー内容もチェックしてくださいね。
マニュアルも読んでね。

http://dev.mysql.com/doc/refman/5.1/ja/create-table.html
http://dev.mysql.com/doc/refman/5.1/ja/information-functions.html

投稿日時 - 2010-06-23 19:55:36

ANo.2

質問内容が、いまいち分かりにくいですが。。。
MySQLの質問をする場合は、最低限、MySQL 4.0、4.1、5.0といったレベルまでバージョンを提示してください。

実機確認しておらず、的外れかも知れませんけど。

last_insert_id()は、どこから拾ってきているのですか?
また、「書込みが行われない」とは、具体的にどうなるのですか?警告やエラーが出ているなら、具体的に提示してください。

もし提示されたinsert文を、その通りの順番で実行しているなら、最初のinsert文の実行時のlast_insert_id()はnullか0で、自動で採番されてinsertできているのかも。

そして2番目以降のinsertでは、その前のinsertで自動で採番されlast_insert_id()に値が入っているので、その同じ値でinsertすることになり、重複エラーになっていたりしませんか?

auto_incrementで番号を生成するには、

(1)その列に値を格納しない
(2)nullを格納
(3)0を格納

といった方法になります。
1以上を格納する場合は、自動で採番されず、その指定した値が格納されます。

投稿日時 - 2010-06-23 18:09:36

あなたにオススメの質問