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

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

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

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

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

servlet

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

Q&A

解決済

2回答

1444閲覧

servletでPostgreSQLのアイテム更新時の制約違反

roro_mochi

総合スコア48

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

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

servlet

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

0グッド

0クリップ

投稿2018/09/20 07:57

お世話になります。

DBとサーブレットで商品管理システムを練習しているのですが、
商品情報を更新するところで「重複キーが一意性制約」のエラーが出ています。

未熟で恐れ入りますが、ご教授をお願いいたします。

エラー

org.postgresql.util.PSQLException: ERROR: 重複キーが一意性制約"item_pkey"に違反しています

idが主キーなので引っかかっているので、下記を「item_id=null」としてみましたが、
列の違反エラーが返ってきました。

試した事

String sql = "update item set item_id=null, item_name=?, item_exp=?, category=?, brand=?, investment=?, price=?, review=?";

やりたいこと

itemというテーブルにある登録済DBの項目のいずれか(任意)が変更されたらDBテーブルを更新したい。 例)価格とIDが間違えていたから更新 例)名前だけ更新 例)在庫と価格を更新

わからないこと

・そもそもIDは主キーなので、重複してしまうため回避するための方法をifとする場合、 どのような記述になるのか ・ポスグレは、commit();やrollback();が自動でできる。というサイトを見かけましたが、 今回省いてよかったでしょうか?

ソース UpdateItem.java

package item; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; 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; @WebServlet("/item/updateitem") public class UpdateItem extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 変数定義 Connection conn = null; PreparedStatement ps = null; // DB接続情報を設定する String path = ""; // 接続パス String id = ""; // ログインID String pw = ""; // ログインパスワード // SQL文を定義する String sql = "update item set item_id=?, item_name=?, item_exp=?, category=?, brand=?, investment=?, price=?, review=?"; try { // JDBCドライバをロードする Class.forName("org.postgresql.Driver"); // DBへのコネクションを作成する conn = DriverManager.getConnection(path, id, pw); // 実行するSQL文とパラメータを指定する ps = conn.prepareStatement(sql); ps.setString(1, request.getParameter("id")); ps.setString(2, request.getParameter("name")); ps.setString(3, request.getParameter("exp")); ps.setString(4, request.getParameter("category")); ps.setString(5, request.getParameter("brand")); ps.setInt(6, Integer.parseInt(request.getParameter("investment"))); ps.setInt(7, Integer.parseInt(request.getParameter("price"))); ps.setInt(8, Integer.parseInt(request.getParameter("review"))); // UPDATE文を実行する int line = ps.executeUpdate(); // 処理件数を表示する System.out.print("処理結果:" + line + "件処理しました。"); if (line > 0) { System.out.print("更新に成功しました。"); } else { System.out.println("エラーが発生しました。"); } } catch (Exception ex) { ex.printStackTrace(); } finally { // クローズ処理 if (ps != null) try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } if (conn != null) try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }

ソース updateItem.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"%> <%@ page import="java.util.List"%> <%@ page import="bean.Item"%> <% @SuppressWarnings("unchecked") //波線防止 List<Item> list = (List<Item>) request.getAttribute("item"); //itemはItemDaoのlist %> <!-- 削除対象商品表示し削除ボタン実行で削除 --> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="../css/styletop.css"> <title>商品検索結果</title> </head> <body> <h1>商品検索結果</h1> <form action="updateitem" method="post"> <div class="container"> <table class="table table-bordered table-striped"> <tr class="table-info"> <th class="text-center">ID</th> <th class="text-center">商品名</th> <th class="text-center">商品説明</th> <th class="text-center">カテゴリー</th> <th class="text-center">メーカー</th> <th class="text-center">在庫</th> <th class="text-center">価格</th> <th class="text-center" style="width: 60px;">評価</th> </tr> <% for (Item item : list) { %> <tr> <td><input type="text" name="id" size="2" value="<%=item.getId()%>"></td> <td><input type="text" name="name" value="<%=item.getName()%>"></td> <td><input type="text" name="exp" value="<%=item.getExp()%>"></td> <td><input type="text" name="category" size="11" value="<%=item.getCategory()%>"></td> <td><input type="text" name="brand" size="11" value="<%=item.getBrand()%>"></td> <td class="text-right"><input type="text" name="investment" size="2" value="<%=item.getInvestment()%>"></td> <td class="text-right"><input type="text" name="price" size="2" value="<%=item.getPrice()%>"></td> <td class="text-right"><input type="text" name="review" size="2" value="<%=item.getReview()%>"></td> </tr> <% } %> </table> </div> <!-- <br> 編集する商品の正式名を入力:<input type="text" name="againupdate"> --> <br> <input type="submit" id="updatebtn" value="編集する"> <!-- JSここから//アラート --> <script> var btn = document .getElementById('updatebtn'); btn.addEventListener('click', function() { window.confirm('更新しますか?'); }) </script> <!-- JSここまで --> </form> <br> <br> <a href="search.jsp">トップに戻る</a> </body> </html>

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

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

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

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

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

guest

回答2

0

ベストアンサー

itemというテーブルにある登録済DBの項目のいずれか(任意)が変更されたらDBテーブルを更新したい。

例)価格とIDが間違えていたから更新
例)名前だけ更新
例)在庫と価格を更新

・そもそもIDは主キーなので、重複してしまうため回避するための方法をifとする場合、
どのような記述になるのか

更新するのだから、where 条件でキーを指定する必要があります。
気になる点として、「IDが間違えていた」は、
・既に存在するIDに対する処理を別なIDで登録した
・新規のIDを誤って登録した
のケースが考えられます。
前者がある場合、更新するとキー重複が発生しますので、更新ではなく削除する必要があります。

・ポスグレは、commit();やrollback();が自動でできる。というサイトを見かけましたが、
今回省いてよかったでしょうか?

AUTOCOMMITモードはありますが、デフォルトでそうなっているわけではありません。
接続時に指定しているのであれば、commitやrollbackは不要ですが、作法的に制御していた方が無難だと思います。
SET AUTOCOMMIT

投稿2018/09/20 08:23

編集2018/09/20 08:24
sazi

総合スコア25173

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

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

0

SQLのUPDATE文は、WHERE句で更新するレコードを指定しないと、全件更新になりますよ。

投稿2018/09/20 08:04

A-pZ

総合スコア12011

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

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

roro_mochi

2018/09/20 08:14

早速ありがとうございます。 更新するレコードは、ユーザーが変更した項目になるのですが その場合のwhereはどのように指定するのでしょうか? --------------------- where item_idとしたところ、下記エラーとなりました。(idはcharacter型) ERROR: WHERE の引数は text 型ではなくブール型でなければなりません。 ほかにもwhere item_id and item_name and...としましたがエラーとなりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問