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

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

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

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

SQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

1回答

1411閲覧

(SQL)テーブル内の一番最新日(もしくは一番大きいid番号)のレコードがupdateできない。

koske

総合スコア1

Java

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

SQL

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2021/09/20 23:54

前提・実現したいこと

質問を連投し、失礼します。
現在自己学習でjavaのwebアプリケーションを作成しています。
ツールはeclipse, mariaDBを使用しています。

アプリケーションの内容は、体調不良の方を対象に症状・体温をプルダウンで選択してもらい(Sym_fevテーブルにデータ格納)、
その組み合わせに合致したレコードを一覧画面にSymptomテーブルから抽出する(抽出するデータは症状カラム(symptom)・体温カラム(fever_degree)のデータに加え、対処法(handle_information)カラムのデータも取得)
といった内容です。

今回は症状(symptom_name)と体温(fever_degree)を更新画面で更新する(sym_fevテーブルのsymptom_nameとfever_degreeを更新)際の不具合について質問をさせて頂きます。
(追加画面の「追加」ボタンをクリックすると、
トップページに遷移するため「追加完了」ページはございません。)

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

DB内の最新のレコードを更新したいのですが、
最新データ(もしくは一番大きいid番号)を更新するsql文の書き方が不明点でございます。

sym_fevテーブル内のカラム情報

create table symptom (
-> symptom_id integer AUTO_INCREMENT,
-> symptom_name varchar(30) not null,
-> fever_degree varchar(15) not null,
-> handle_information varchar(50) not null,
-> reg_datetime datetime not null,
-> upd_datetime datetime not null,
-> primary key(symptom_id));

該当のソースコード

SymptomUpdateServlet.java(データの更新を行うservlet) package webapp.SymptomManagement; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import web.basic.symFev.beans.SymFevInfoBean; /** * Servlet implementation class SalesUpdateServlet */ @WebServlet("/SymptomUpdateServlet") public class SymptomUpdateServlet extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public SymptomUpdateServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("SymptomUpdateServlet.doGet()"); System.out.println("【症状更新画面表示】"); SymFevInfoBean symFevInfo = new SymFevInfoBean(); // ■DB接続 Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; // 接続情報 String url="jdbc:mariadb://localhost:3306/condition_management"; String user="〇〇"; String password="〇〇"; try { // 接続処理 conn = DriverManager.getConnection(url, user, password); // ■検索処理実行 // SQL作成 String sql = "SELECT\r\n" + " sym_fev.information_id,\r\n" + " sym_fev.symptom_name,\r\n" + " sym_fev.fever_degree \r\n" + "FROM\r\n" + " sym_fev"; System.out.println(sql); // SQL準備 ps = conn.prepareStatement(sql); // SQL実行 rs = ps.executeQuery(); // データを読込み、売上情報に設定する System.out.println("<症状情報を設定>"); while(rs.next()) { // データ読込 int informationId = rs.getInt("information_id"); String symptomName = rs.getString("symptom_name"); String feverDegree = rs.getString("fever_Degree"); // 売上情報(JavaBeans)に追加 symFevInfo.setInformationId(informationId); symFevInfo.setSymptomName(symptomName); symFevInfo.setFeverDegree(feverDegree); System.out.println(symFevInfo); } } catch(SQLException e) { // 接続失敗時の処理 e.printStackTrace(); } finally { try { // ■クローズ処理 // 検索結果 if(rs!=null) { rs.close(); } // SQL文 if(ps!=null) { ps.close(); } // DB接続 if(conn!=null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } // 【表示値を設定する】 request.setAttribute("symFevInfo", symFevInfo); // ■更新画面処理に遷移 request.getRequestDispatcher("Sym_fevUpdate.jsp").forward(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("ShopInfoServlet.doPost()"); // 【文字化け対応】 request.setCharacterEncoding("utf-8"); // 【画面入力値を取得し、店舗情報に設定する】 // 画面入力値を取得 String symptomName = request.getParameter("symptom_name"); String feverDegree = request.getParameter("fever_degree"); // 取得できたか確認 System.out.println("symptomName="+symptomName); System.out.println("feverDegree="+feverDegree); // 【店舗情報を更新する】 // ■DB接続 Connection conn = null; PreparedStatement ps = null; // 接続情報 String url="jdbc:mariadb://localhost:3306/condition_management"; String user="〇〇"; String password="〇〇"; try { // 接続処理 conn = DriverManager.getConnection(url, user, password); <未解決の箇所> // ■更新処理実行 // SQL作成 // information_idが一番大きいデータを更新(または最新日のデータ) String sql = "UPDATE sym_fev SET symptom_name = ?, fever_degree = ?" //where reg_datetime = "; System.out.println(sql); // SQL準備 ps = conn.prepareStatement(sql); // パラメータ設定(画面入力値を設定していく。) ps.setString(1, symptomName); // 症状名 ps.setString(2, feverDegree); // 体温 // トランザクション開始 conn.setAutoCommit(false); // SQL実行 ps.executeUpdate(); // コミット conn.commit(); System.out.println("ここまで来てる。"); } catch(SQLException e) { // 接続失敗時の処理 e.printStackTrace(); try { // ロールバック conn.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } finally { try { // ■クローズ処理 // SQL文 if(ps!=null) { ps.close(); } // DB接続 if(conn!=null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } // ■トップページにリダイレクト response.sendRedirect("TopPage.html"); } } Sym_fevUpdate.jsp(更新画面の見た目) <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>体調管理アプリ</title> </head> <body> <form action="SymptomUpdateServlet" method="post"> <div> <label for="symptomInfo">症状<input type="hidden" name="symptom" value="${symFevInfo.symptomName}"></label> <select name="symptom_name"> <option value="症状">症状</option> <option value="倦怠感">倦怠感</option> <option value="吐き気">吐き気</option> <option value="味覚・嗅覚の消失">味覚・嗅覚の消失</option> <option value="呼吸困難">呼吸困難</option> </select> </div> <div> <label for="feverDegreeInfo">体温<input type="hidden" name="fever" value="${symFevInfo.feverDegree}"></label> <select name="fever_degree"> <option value="体温">体温</option> <option value="低体温">36.0℃未満</option> <option value="通常体温">36.0 ~ 36.5℃</option> <option value="弱微熱">36.6 ~ 37.0℃</option> <option value="発熱">37.1℃以上</option> </select> </div> <input type="submit" value="更新"> </form> <form action="" method="post"> <input type="submit" value="一覧画面"> </form> <form action="" method="post"> <input type="submit" value="ログアウト"> </form> </body> </html>

疑問点

max関数を用いてidまたは日付の一番大きい値をwhere句で指定して更新しようと思ったが
集約関数のためwhere句の横には書けない。
→この場合、一つのレコードを特定して更新をかけるということは不可能なのでしょうか。

もしよろしければご教授頂きたいです。
よろしくお願いします。

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

バージョン:java11
Tomcat9
xampp control panel v3.3.0
ここにより詳細な情報を記載してください。

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

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

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

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

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

maisumakun

2021/09/21 00:04

「対象のレコードを特定する→そのレコードを更新する」という2本のSQLに分ける、というのがわかりやすいかと思うのですが、その方法ではだめなのでしょうか?
koske

2021/09/21 00:13

maisumakunさん、ご返信を頂き有難うございます。 最終的に最新のレコードが更新できれば問題ないのですが、 二本のsqlに分けるというイメージが出来ていない状態です。 理解不足で失礼します。
maisumakun

2021/09/21 00:26

書いてのとおりです。 1回目のSQL→必要な条件でSELECTを行って、対象となるidを抽出する 2回目のSQL→上で抽出したidを設定して、そのレコードを更新する
jimbe

2021/09/21 19:19

Webアプリなら複数のクライアントから同時にアクセスされることがありそうですが、その場合、更新先が「最新(最後)のレコード」なのはマズイのではないでしょうか。
koske

2021/09/24 05:46

jimbeさん、こんにちは。 こちらは練習用のアプリケーションになりますので、ひとまずこの方法で進めようと思います。 ご心配頂き有難うございます。
guest

回答1

0

自己解決

String sql = "UPDATE sym_fev SET symptom_name = ?, fever_degree = ? ORDER BY information_id DESC LIMIT 1";

に書き換えることで、
最大のinformation_idのレコードの更新に成功しました。
ご回答いただいた方有難うございました。

投稿2021/09/21 00:26

koske

総合スコア1

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

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

sazi

2021/09/21 02:44

多分使用しているのはMySQLでは無いですか? updateにorder byが指定可能なのは標準ではありませんのでご注意を。
koske

2021/09/21 03:22

saziさん、ご返信を頂き有難うございます。 現在使用しているDBはmysqlです。 今後気を付けたいと思います。 ご教授頂き有難うございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問