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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

2945閲覧

AUTO_INCREMENTの自動採番が機能しない原因を特定したい

asahiko123

総合スコア43

Java

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/08/07 02:51

編集2021/08/10 01:57

前提・実現したいこと

 Spring Bootを用いて標準的なCRUD機能をもつアプリケーションを作っています。
問題はschema.sqlのテーブルに記述したAUTO_INCREMENTが機能してないらしい部分が
あり、これを復活させたいというものです。

発生している問題・エラーメッセージ

NULL not allowed for column "ID"; SQL statement: INSERT INTO DAILYREPORT(type_id,stuff_id,work_id,created,startTime,endTime,detail,name) VALUES(?,?,?,?,?,?,?,?) [23502-200]; nested exception is org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: 列 "ID" にはnull値が許されていません

該当のソースコード

schema.sql

CREATE TABLE IF NOT EXISTS DAILYREPORT( id INT(2) NOT NULL AUTO_INCREMENT, stuff_id INT(2) NOT NULL, work_id INT(2) NOT NULL, type_id INT(2) NOT NULL, created VARCHAR NOT NULL, startTime VARCHAR NOT NULL, endTime VARCHAR NOT NULL, detail VARCHAR(20) NOT NULL, name VARCHAR(20) NULL, PRIMARY KEY(id) ); CREATE TABLE IF NOT EXISTS DAILYREPORT_TYPE( id INT NOT NULL, progress VARCHAR NOT NULL );

Daoの情報をinsertする部分

public void insert(DailyReport dailyReport) { jdbcTemplate.update("INSERT INTO DAILYREPORT(type_id,stuff_id,work_id,created,startTime,endTime,detail,name) VALUES(?,?,?,?,?,?,?,?)", dailyReport.getTypeId(),dailyReport.getStuffId(),dailyReport.getWorkId(),dailyReport.getCreated(),dailyReport.getStartTime(),dailyReport.getEndTime(),dailyReport.getDetail(),dailyReport.getName()); }

data.sql ①

INSERT INTO `DAILYREPORT_TYPE` VALUES (1,'0%'), (2,'10%'), (3,'20%'), (4,'30%'), (5,'40%'), (6,'50%'), (7,'60%'), (8,'70%'), (9,'80%'), (10,'90%'), (11,'100%');

data.sql ②

INSERT INTO `DAILYREPORT_TYPE` ( `id` ,`progress` ) SELECT `id`, `progress` FROM ( SELECT 1 AS `id`, '0%' AS `progress` FROM dual UNION ALL SELECT 2 AS `id`, '10%' AS `progress` FROM dual UNION ALL SELECT 3 AS `id`, '20%' AS `progress` FROM dual UNION ALL SELECT 4 AS `id`, '30%' AS `progress` FROM dual UNION ALL SELECT 5 AS `id`, '40%' AS `progress` FROM dual UNION ALL SELECT 6 AS `id`, '50%' AS `progress` FROM dual UNION ALL SELECT 7 AS `id`, '60%' AS `progress` FROM dual UNION ALL SELECT 8 AS `id`, '70%' AS `progress` FROM dual UNION ALL SELECT 9 AS `id`, '80%' AS `progress` FROM dual UNION ALL SELECT 10 AS `id`, '90%' AS `progress` FROM dual UNION ALL SELECT 11 AS `id`, '100%' AS `progress` FROM dual ) WHERE NOT EXISTS ( SELECT `id` FROM `DAILYREPORT_TYPE` WHERE `progress` = '0%' OR `progress` = '10%' OR `progress` = '20%' OR `progress` ='30%' OR `progress` ='40%' OR `progress` ='50%' OR `progress` ='60%' OR `progress` ='70%' OR `progress` ='80%' OR `progress` ='90%' OR `progress` ='100%' );

試したこと

INSERT INTO DAILYREPORT~の部分がエラーとして表示されてますが、schema.sqlのテーブルでIDをAUTO_INCREMENTしているのでINSERTには含めないでいいはず...と思っています。しかしIDがNULLということはテーブルの自動採番が機能してないということです。

この問題は①のテーブルを②に変更したことで生じました、、
なのでこの問題の原因はこの変更にあるような気がしますが
この予測は正しいでしょうか?

DAILYREPORT_TYPEというテーブルはDAILYREPORTテーブルと内部結合します。

String sql = "SELECT DISTINCT DAILYREPORT.id, stuff_id, work_id, DAILYREPORT.type_id,stuff_id, created, startTime, endTime, DAILYREPORT.detail, DAILYREPORT.name," + " progress , registeredId ,workDivId FROM DAILYREPORT " + " INNER JOIN DAILYREPORT_TYPE ON DAILYREPORT_TYPE.id = DAILYREPORT.type_id"

補足情報(FW/ツールのバージョンなど)

Spring Tool Suite 4-4.10.0.release
H2 database
Spring Boot v2.5.0
java11

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

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

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

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

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

jimbe

2021/08/10 04:04

ちなみに、例外が発生した時の DAILYREPORT テーブルと DAILYREPORT_TYPE テーブルの中はどのようなデータになっていましたでしょうか。
asahiko123

2021/08/12 20:55

こちら昨日自己解決できました。返信遅くなり申し訳ありません。
guest

回答1

0

自己解決

記載したコードとは別の場所でIDの値を上書きしてる箇所を見つけ、削除したら正常になりました。

投稿2021/08/12 20:55

asahiko123

総合スコア43

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問