お世話になります。
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>
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。