• ベストアンサー

INSERT文について…。

お世話になります☆ データベースへのデータ登録をJavaからSQL文を実行して行いたいの ですが、一つのテーブルのNOという列にPRIMARY KEYとAUTO_INCREMENT制約を設定しており もう一つのテーブルのNOという列にはPRIMARY KEYだけを設定していると仮定します。 一度のSQLの実行で二つのテーブルに登録を行いたいのですが、 2回目の実行でSQLExeptionが発生してしまいます…。 理由は、AUTO_INCREMENTを設定していない方のテーブルで同じNOで 登録をしようとしているからだと思うのですが(違うかな?) 両方にAUTO_INCREMENTを設定しても1回しか登録できずエラーが 発生してしまいます。 何か考えられる対策はありますでしょうか? まだ勉強したてで説明不足な点もあるかも知れませんが捕捉も致します。 宜しくご教授願います…。

  • MySQL
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.2

SQL 関数 LAST_INSERT_ID() または C API 関数 mysql_insert_id() を使用すると、最後に生成した AUTO_INCREMENT の値を取得できます。 AUTO_INCREMENT で発行したものを mysql_insert_id() で取得してから 次のSQLを発行すればできると思います。

参考URL:
http://dev.mysql.com/doc/refman/4.1/ja/example-auto-increment.html
fa_fa0321
質問者

お礼

ありがとうございます!すいません…。自己解決しました!

その他の回答 (1)

  • ipsum11
  • ベストアンサー率21% (55/251)
回答No.1

そのSQLがわからないと何処がおかしいかわかりません。 でも、「NO」に「PRIMARY KEY」を設定しているなら、当然同じ「NO」では登録できませんよね。

fa_fa0321
質問者

お礼

ありがとうございます!すいません…。自己解決しました!

fa_fa0321
質問者

補足

早速の返答ありがとうございます!説明不足すいません…。 AUTO_INCREMENTの制約がある方へのSQL文のメソッドの内容です。 --------------------------------------------------------------- sb.append("INSERT"); sb.append(" INTO"); sb.append(" article_db "); sb.append("( name, comment, pprc, price, min_number, unit)"); sb.append(" VALUES"); sb.append(" ( ?, ?, ?, ?, ?, ?)"); PreparedStatement ps = con.prepareStatement(sb.toString()); String name = (String)formList.get(0); String comment = (String)formList.get(1); String pprc = (String)formList.get(2); String price = (String)formList.get(3); String min_number = (String)formList.get(4); String unit = (String)formList.get(5); ps.setString(1, name); ps.setString(2, comment); ps.setString(3, pprc); ps.setString(4, price); ps.setString(5, min_number); ps.setString(6, unit); int index = ps.executeUpdate(); ---------------------------------------------------------------- もう一つの方のテーブルへのSQL文です。↓ ---------------------------------------------------------------- StringBuffer sb = new StringBuffer(); sb.append("INSERT"); sb.append(" INTO"); sb.append(" base_db "); sb.append("( name, stock)"); sb.append(" VALUES"); sb.append(" ( ?, ?)"); PreparedStatement ps = con.prepareStatement(sb.toString()); String name = (String)baseList.get(0); String stock = (String)baseList.get(1); ps.setString(1, name); ps.setString(2, stock); int index = ps.executeUpdate(); ---------------------------------------------------------------- ?へは、フォームの値を代入してます。formList,baseListは引数を リストに格納してこのメソッドに渡していて、get()で取得してます。 宜しくお願いします。

関連するQ&A

  • alter文について

    mysqlのバージョンはversion: 4.0.22です。 alter文を使って、 オートインクリメントでプライマリーキーを3つ付けたいのですが どのように記述したらいいのでしょうか・・・。 すみませんが教えてください。 Aテーブルのカラムがno,p1,p2,temp1,temp2,temp3です。 現在は、p1だけがプライマリーになっている状態です。 noをオートインクリメントとプライマリー p1,p2をプライマリーにしたいです。

    • ベストアンサー
    • MySQL
  • 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
  • データベースと正規化とINSERT文について

    ただいま以下の一つのテーブルを正規化しようとしています。 テーブル:英単語 フィールド:単語、意味1、意味2、意味3、品詞、分類1、分類2、分類3、例文、難易度、ID(主キー・オートインクリメント) これを以下のように分けました。(分類とは単語の分類です。例えば year なら意味は 年 で分類は 時間 とか 単位 とか属性を入れたいのです。) ****** テーブル:英単語 フィールド:単語、意味1、意味2、意味3、分類ID、分類ID、分類ID、例文ID、難易度、ID(主キー・オートインクリメント) テーブル:分類 フィールド:分類名、ID(オートインクリメント 主キー) テーブル:品詞 フィールド:品詞名、ID(オートインクリメント 主キー) テーブル:例文 フィールド:例文、ID(オートインクリメント 主キー) ****** (1)これで正規化できているでしょうか? もしできていないなら、どうすればよいでしょうか? (2)また、仮にこのままデータベースを作るとすると、INSERTの時に英単語テーブルの分類IDに、分類テーブルのIDをひもづけるにはどうしたら良いのでしょうか? INSERT INTO 分類 (分類名) VALUES("時間") のあと、オートインクリメントされたIDを取り出して、英単語テーブルに入れるにはどうしたらいいでしょうか。

    • ベストアンサー
    • MySQL
  • 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
  • phpMyAdminでPRIMARY KEY AUTO_INCREMENT

    phpMyAdminの操作画面上でPRIMARY KEY AUTO_INCREMENTを設定する方法を教えてください。 SQLを使えばできるのですが、phpMyAdmin上ではAUTO_INCREMENTという項目が見当たりません。 かんたんな内容ですが、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • auto_incrementを設定し直す。

    Primary Keyとして、auto_incrementを利用しているのですが、レコードを削除したりすると数が飛びます。 これを設定し直す事はできないのでしょうか? できないのなら、SQL文でupdataし直す。 auto_incrementをやめて、重複しない数を入れる。 ・・・しかないんかな??

  • 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
  • insert後のプライマリキーの取得

    タイトルの通りなのですが テーブルがこんな感じでtest_stringをインサートしてその後に test_idを受け取りたいのですが何か方法はないでしょうか。 CREATE TABLE test ( test_id int(8) AUTO_INCREMENT , test_string VARCHAR(100), PRIMARY KEY (test_id) ); こんな風にしても1ばかり返ってきます。 String sql = "SELECT * FROM test;" int primarykey = st.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS);

  • 後からAUTO_INCREMENTの値を1にする方法

    MySQL=4.0.26 phpMyAdmin 2.6.4-pl4を使用しています。 AUTO_INCREMENT(int11)が自動追加されて、数値が70になったとして レコードを削除しても数値が1になりません。 プライマリーキーの関係かなと思いますが、 後からphpMyAdmin上でAUTO_INCREMENTの値を1にする方法、また、自由に数値を変更する方法を教えて頂けないでしょうか。 初期の段階でDBを構築する場合でSQLを実行する場合の AUTO_INCREMENTは解るのですが、 たとえば PRIMARY KEYを(`no`)として TYPE=MyISAM AUTO_INCREMENT=1; として、正常に利用していますが、 DB構築後、レコードが登録された後、phpMyAdmin上で レコードを削除した後またAUTO_INCREMENT=1などにする方法が 解りません。 説明べたで申し訳御座いませんが、 どうぞ宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • MySQLのINSERT時にたまに重複になる

    下記の通り同じデータが無かった場合に限りインサートしています。 //同じデータが既にあるか確認 $sql = "select * from `reg_data` where "; $sql .= "`Date` = '".$date."' and "; $sql .= "`ID` = '".$id."' and "; $sql .= "`No` = '".$no."'"; $result = mysql_query($sql); $rows = mysql_num_rows($result); //データが0なら今日のレコード作成 if($rows == 0){ $sql = "insert into `reg_data` values('0', '".$date."', '".$id."', '".$no.")"; mysql_query($sql); } しかし、3%ぐらいの確立で重複インサートになってしまいます。 重複といっても 1個目のフィールドはAUTO_INCREMENTになっておりまして AUTO_INCREMENTの値が重複する事は無いです。 $date、$id、$noがまったく同じテーブルがいくつか重複した場合でも AUTO_INCREMENTの値は全て連番になっています。 重複インサートが発生しないよう改善するには どうしたら良いでしょうか。 日付を2フィールド目に書いているので 0時0分1秒辺りでインサートが集中してしまいます。 分散させられたら改善するような気がしますが いい案が思いつきません。 宜しくお願い致します。

    • ベストアンサー
    • PHP