• ベストアンサー
  • 困ってます

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は書き込みが不要の場合もあるので カラム指定の書き込みは必須となるのですが・・・行き詰ってしまいました・・・。 ご教授頂ければ幸いです。 どうぞ、宜しくお願い致します。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数802
  • ありがとう数20

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

  • ベストアンサー
  • 回答No.1
  • yambejp
  • ベストアンサー率51% (3827/7415)

いまいち何をしたいのかわかりません。 AAAがAUTOINCREMENTなら、わざわざlast_insert_id()を指定しなくてよいのでは? INSERT IGNORE INTO `TESTtable`(`BBB`,`CCC`,`DDD`) VALUES(50,600,50) とすればいいような気がしますが? ※IGNOREはエラー回避のためにつけています。基本的にはなくても動きます ※テーブル名、カラム名はバッククォートで囲むのがMySQLのルールです

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • 副問い合わせのinsert文

    いつもお世話になっています。 insert文の副問い合わせのことでお聞きしたいのですが、 ■通常のinsert文 insert into AAA values(aaa,bbb,ccc); 上記のsqlを副問い合わせにした場合(aaaに別テーブルからの検索結果を入れたい場合)どういうSQL文になるでしょうか。 参考書等を参照すると、副問い合わせの場合はvaluesを省略する(使えない?)と記述がありました。 insert into AAA values ( aaa IN (SELECT bbb from BBB where ccc = ddd),bbb,ccc); とはできないみたいですので… どうかご教授宜しくお願いします。

  • INSERT文の書式

    oracleに触るの初めてなのにストアドなんて書くことに・・ 助けを頂けたらと思います。 ストアドの中でですが・・・・ INSERT文の中ではテーブルの項目が2つ以上あるとき、 変数にその2つ以上分の値を文字列として入れておいて 、その値をINSERT文に流すことってできないのでしょう か? test_str := (' ''テスト1'' , ''テスト2'' '); insert into TestTable (test1 , test2 ) values (test_str); 上記のように書くと PL/SQL: ORA-00947: 値の個数が不足しています。 とのエラーが帰ってきます。 上記のように変数を使って下記のように解釈させたいのですが無理なのでしょうか? insert into TestTable (test1 , test2 ) values ('テスト1','テスト2'); それではお願いします。 失礼いたします。

  • PHP+MYSQL IF文の初歩

    全く初歩の質問で申し訳ございません。 create table test (shohin char(40),uri int(10) ,kai int(10) ,urikai char(40)); insert into test values('りんご',300,200,'黒字'); insert into test values('みかん',500,300,null); insert into test values('ぶどう',null,null,'未入荷'); で 「みかん」のレコードが、uri > kai なら 「みかん」のurikaiを'黒字'にする方法を IF文でどのように書けばよいのかを教えてください。

    • ベストアンサー
    • PHP

その他の回答 (2)

  • 回答No.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

共感・感謝の気持ちを伝えよう!

  • 回答No.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以上を格納する場合は、自動で採番されず、その指定した値が格納されます。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • フィールドをデフォルト0にする

    フィールドをデフォルト0にする方法が知りたいです。 以下のようなサンプルがります。 drop table test_a; create table test_a ( name varchar2(10), a number(1), b number(1), c number(1) ) insert into test_a (name) values ('AAA'); insert into test_a (name,a) values ('BBB', NULL); insert into test_a (name,a,b) values ('CCC', NULL,NULL); select * from test_a; この状態では、a,b,cはNULLですが、a,b,cの値をデフォルト値で0にしたい為、 update test_a set a = 0, b = 0, c = 0; として、データを直して、次回から insert into test_a (name) values ('DDD'); とすると、nameがDDDの時もa,b,cが0となるようにテーブル定義を変えたいのですが 既存のテーブルをそのままで、途中から変更する方法が知りたいです。

  • Viewに対して更新したときもとのTableの値はどうなる?

    SQLの初歩的な質問す。 create view testview as select a,b from testtable ; というようにtestviewを作成して、 insert into testview ( a,b )values( 'aaa','bbb' ) というようにtestview にデータを作成したとき、 testtableの値も更新されるのですか? よろしくお願いします。 以上

  • SQL SERVER INSERT文

    決まった件数単位にデータをINSERTしたい。 例)仕入明細→仕入伝票明細(行は2行まで) 仕入明細 商品CD 商品名 数量 000001 AAA   1 000002 BBB   2 000003 CCC   3 000004 DDD   1 000005 EEE    2 を仕入伝票明細へINSERTするときに2行単位に伝票ID、行をつけて INSERTしたい 仕入伝票明細へは 伝票ID 行 商品CD 商品名 数量 001  1  000001 AAA  1 001  2  000002 BBB  2 002  1  000003 CCC  3 002  2  000004 DDD  1 003  1  000005 EEE  2 伝票IDはコントロールの伝票IDに+1してセットする こんな感じのINSERT文を作りたいのですが、どなたか教えてください 宜しくお願いします

  • OracleでINSERT文のループ

    INSERT文で何万件ものデータをテーブルに挿入したいのですが、 SUBSTRBまたはSUBSTR関数で何バイト分あるいは何文字分抽出して その部分の値をインクリメントさせる記述のしかたがわかりません。 INSERT INTO aaa (ID,YEAR,CLS,NO,THING,CD,LAND,USER,GROUP) VALUES ('30000003000','2000','2','85000','001','55555','10','test','1'); INSERT INTO aaa (ID,YEAR,CLS,NO,THING,CD,LAND,USER,GROUP) VALUES ('30000003001','2000','2','85001','001','55555','10','test','1'); INSERT INTO aaa (ID,YEAR,CLS,NO,THING,CD,LAND,USER,GROUP) VALUES ('30000003002','2000','2','85002','001','55555','10','test','1'); INSERT INTO aaa (ID,YEAR,CLS,NO,THING,CD,LAND,USER,GROUP) VALUES ('30000003003','2000','2','85003','001','55555','10','test','1'); ・ ・ ・ と、いう感じで、IDとNOのみ、値をインクリメントさせて大量のデータを 挿入したいのですが、SUBSTRB関数やループなどを使って効率的に行うやり方がわかりません。どなたか、ご教授ください。

  • Oracleでの現在時刻の取得

    Oracle超初心者です。 Oracle10gでDate型とTimeStamp型のカラムに 以下のように、それぞれ現在時刻をinsertしたいのですが、 知識が皆無なためやり方がわかりません。 insert into TESTTABLE values(?、?) この?に何を入れるべきかどなたかご教授くださいm(_ _)m

  • ファイルに記述されている複数のSQL文を一度に実行させたい

    こんにちわ。 ファイルに記述されているSQL文を、Linuxのコマンドラインなどから 実行したいと考えています。 ファイルに insert into DB_NAME(aaa,bbb,ccc) values(111,222,333); insert into DB_NAME(ddd,eee,fff) values(333,777,222); insert into DB_NAME(aaa,ttt,ddd) values(111,000,999); ... などのSQL文が複数行(例えば1000個ほど)記述しているのを用意して なんかしらの方法で一度に実行させたいのです。 mySQLでは、このようなやり方があるのですが postgreではどのようにすればいいのか、わかりません。 どなたかご存知の方、よろしくお願い致します。 OSはLinuxです。

  • MySQLでWHEN句のサブクエリ中にて

    MySQL ver.5.0.95です。 PHPからSQL文を作ってDBへインサートしているのですが 重複した値が合った場合はupdateするように書いています。 TBL1には |id   |string   |count 1    aaa    0 2    bbb    3 3    ccc    1 TBL2には |id2    |string2    |count2 1      aaa      0 2      bbb      2 3      ccc      1 実際はもう少し複雑ですが、こういう感じでデータが入ってるとします。 このとき、TBL1のそれぞれをインサート若しくはアップデートするのに TBL2の同一IDのものの、count2の状態によって場合分けしたく 同一IDのcount2が1以上なら変更しない、という風にするため以下のように書いたのですが insert into TBL1 values (1, "aaa", 3), (2, "bbb", 3), (3, "ccc", 3), (4, "ddd", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = values(id)) >=1 THEN count ELSE count + values(count) END; #1064 - You have an error in your SQL syntax;というエラーになって出来ません。 WHENの中のサブクエリで、where id2 = values(id) 恐らくこの文がダメなようです。 例えば決め撃ちで1つ1つ書くと通ります。 insert into TBL1 values(1, "aaa", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 1) >=1 THEN count ELSE count + values(count) END; insert into TBL1 values(2, "bbb", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 2) >=1 THEN count ELSE count + values(count) END; insert into TBL1 values(3, "ccc", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 3) >=1 THEN count ELSE count + values(count) END; insert into TBL1 values(4, "ddd", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 4) >=1 THEN count ELSE count + values(count) END; これをエラーになったような文に変えて1文にまとめたいのですが、無理でしょうか? あとそもそもこれをまとめたほうが速いと思ってそうしたいのですが、 変わらないのなら1文1文;でつなげて書くやり方でいこうと思っています。 まとめると速くなることはあるでしょうか?

    • ベストアンサー
    • MySQL
  • INSERT文とUPDATE文の使い分け

    いつもお世話になっております。 MYSQLで x_table ID SUBID  1  aaa 2 aaa 3 bbb 4 ccc というテーブルがあったとして、「IDが 1 かつ、SUB_IDが aaa」の項目が存在する場合はUPDATE、存在しない場合はINSERT、という形でSQLを使い分けたいと考えています。 現在は SELECT * FROM x_table WHERE ID=1 AND SUBID='aaa' というSQLでレコードの存在確認をし、その結果によりif文でUPDATE文とINSERT文を使い分けているのですが、レコードの存在確認とINSERTやUPDATEのSQLを一つにまとめる事が出来るようなやり方って無いでしょうか? 無さそうな場合は「無い」とだけでも答えていただけるとうれしいです。

    • ベストアンサー
    • PHP
  • MySQLから取り出したものを3つに分ける

    MySQLに以下のようなSQLを打ちました。 create table table_list( id int, task varchar(255) ); insert into table_list values(1,'ほげほげ1-1'); insert into table_list values(1,'ほげほげ1-2'); insert into table_list values(2,'ほげほげ2-1); insert into table_list values(2,'ほげほげ2-2'); insert into table_list values(3,'ほげほげ3-1'); そして、空のdiv要素が3つあります。 このデータベースからidの数値別に、div要素へtaskの文字列を入れたいのですが、どうすればいいのでしょうか? SQLで「select * from table_list」をやってからtaskを取り出すのか、3回SQLで「select task from table_list where id=1」のようにするのがよろしいんでしょうか?

    • ベストアンサー
    • PHP
  • MySQL初心者

    -mysql CREATE DATABASE testdb; use testdb; CREATE TABLE car_table(id int(10),name varchar(50)); INSERT INTO car_table VALUES (2,'乗用車'); INSERT INTO car_table VALUES (3,'オープンカー'); INSERT INTO car_table VALUES (4,'トラック'); SELECT * FROM car_table; これで間違ってるとは思わないんですが、なぜか ERROR 1049(42000): Unknown database 'testdb・・ とでます。なぜなんでしょうか?全然わかりません。 何かの設定ミスかなにかでしょうか?

    • ベストアンサー
    • MySQL