質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

Q&A

1回答

4006閲覧

AUTO_INCREMENTを設定しているカラムでINSERT重複エラー

tera78

総合スコア9

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

0グッド

1クリップ

投稿2020/04/16 06:44

編集2020/04/17 05:37

MySQL:5.6.10
JDBCドライバ:mysql-connector-java-6.0.5.jar
Java:1.8

JavaアプリケーションよりMySQLに対してINSERTを発行した際にエラーが発生しました。

タイトルの通りなのですが、AUTO_INCREMENTを設定しているカラム('id')のあるテーブルに対してINSERT('id'は指定しません)を発行した際に以下のエラーが出ました。

Duplicate entry '389871' for key 'PRIMARY'

ちなみに上記の'389871'はエラーの出たINSERTの数時間前に登録されたレコードなので、ほぼ同時にINSERTしてエラーになったというわけでもありません。またしばらくおいて再度INSERTすると成功しました。

恐らくAUTO_INCREMENTの採番値が更新されていなかったのだと思いますが、そのような事は発生するのでしょうか?また発生しやすい状況等ありましたらご教授頂くと幸いです。

**** 追記 ****
DDLとINSERT文です(※カラム名や値は変えています)
test2テーブルのINSERTで、AI_IDの重複でエラーになります。

-- DDL CREATE TABLE test ( id int NOT NULL AUTO_INCREMENT, hoge1 varchar(10) NOT NULL, hoge2 varchar(10) NOT NULL, datetime1 datetime NOT NULL, datetime2 datetime NOT NULL, datetime3 datetime NOT NULL, datetime4 datetime NOT NULL, hoge3 varchar(50) NOT NULL, hoge4 int NOT NULL, hoge5 int NOT NULL, hoge6 varchar(255), hoge7 int NOT NULL, hoge8 int NOT NULL, hoge9 int NOT NULL, datetime5 datetime NOT NULL, datetime6 datetime NOT NULL, PRIMARY KEY (id) ) ENGINE = InnoDB; CREATE TABLE test2 ( AI_ID int NOT NULL AUTO_INCREMENT, id int NOT NULL, id2 varchar(50), hoge10 varchar(255) CHARACTER SET ascii, hoge11 varchar(10), hoge12 int, datetime1 datetime NOT NULL, datetime2 datetime NOT NULL, PRIMARY KEY (AI_ID), CONSTRAINT uq_test2_01 UNIQUE (id, id2, hoge10) ) ENGINE = InnoDB; CREATE TABLE test3 ( id2 varchar(50) NOT NULL, hoge13 text NOT NULL, hoge14 varchar(255) NOT NULL, hoge15 tinyint unsigned, hoge16 varchar(255), hoge17 date, hoge18 varchar(255), hoge19 varchar(255), hoge20 varchar(255), hoge21 varchar(255), hoge22 tinyint unsigned NOT NULL, hoge23 tinyint unsigned, hoge24 tinyint unsigned DEFAULT 0 NOT NULL, hoge25 tinyint unsigned, hoge26 datetime NOT NULL, hoge27 datetime NOT NULL, PRIMARY KEY (id2) ) ENGINE = InnoDB; ALTER TABLE test2 ADD FOREIGN KEY (id) REFERENCES test (id) ON UPDATE RESTRICT ON DELETE RESTRICT ; ALTER TABLE test2 ADD FOREIGN KEY (id2) REFERENCES test3 (id2) ON UPDATE RESTRICT ON DELETE RESTRICT ; -- INSERT文 insert into test2(id, id2, hoge10, hoge11, hoge12, datetime1, datetime2) values(211, 'id2', 'hoge10', 'hoge11', null, NOW(), NOW());

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

javahack

2020/04/16 11:40

テーブル定義と発行したSQL文を質問に追記した方が回答が得られやすくなります。
guest

回答1

0

きちんとトランザクション処理すればいけそうな気がしますが
あとはどんなテーブル構成に対してどんなSQLを発行したかによります

投稿2020/04/16 06:51

yambejp

総合スコア114777

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問