0

特定のユーザーがドロップダウン メニューから選択した特定の製品を購入できるようにする、学校向けの単純な Web ベースのアプリケーションを構築しています。ユーザーがドロップダウン メニューから選択した製品をクリックして購入するたびに、この製品は購入済みアイテム テーブルに格納され、同時に製品と呼ばれる別のテーブルから削除されます。私が知っていることから、これを行うには、ユーザー、製品、購入の 3 つのテーブルが必要です。購入テーブルには、購入者の #1 と #2 の外部キーを持つ 2 つの列が必要です。購入した製品。私はこの問題を解決したと思っていましたが、私の Glassfish サーバーは私に次のエラーをスローし続けます:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:
子行を追加または更新できません: 外部キー制約が失敗します
(`webprodaja`.`kupljeno`, CONSTRAINT `kupljeno_ibfk_1` FOREIGN KEY (`id`) REFERENCES users(`id` ) )))

問題のテーブルと外部キーは次のとおりです。

テーブル「ユーザー」:

id | name
1  | Ivan
2  | Beka
3  | Ogi

表 'proizvodi' (eng. products):

id | name
1  | kafa
2  | jafa
3  | ratluk

テーブル 'kupljeno' (eng. purchase):

id | name | proizvod
2  | Beka | 3
3  | Ogi  | 2

テーブル「kupljeno」にも 2 つの外部キーがあります。

「id」列に配置され、テーブル「users」とその列「id」を参照するもの。

「proizvod」列に配置され、テーブル「proizvodi」とその列「id」を参照する別のもの。

だから私がやろうとしているのは、購入者が選んだ製品を削除し、その名前を「proizvod」列から削除して、同じ製品を「kupljeno」列に入れることです。しかし、購入して詳細を「kupljeno」列に保存することはできましたが、何らかの理由で、「proizvod」列で購入中の製品を削除するどころか、これを行うことができなくなりました。

また、価値のある完全な index.jsp コードは次のとおりです。

<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.DriverManager"%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
        <body>


    <%


        Class.forName("com.mysql.jdbc.Driver").newInstance();
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/webprodaja","root","");
        Statement st = conn.createStatement();
       // if(request.getParameter("add")!=null){

            ResultSet rs = st.executeQuery("select * from users");
            %>
            <form action="index.jsp" method="post">  
            <select name="user">

                <%
                while(rs.next())
                   {
                    String name=rs.getString(2);
                    String id = rs.getString(1);
                %>

                <option  value="<%=name%>" ><%=name%></option>

                <%
                   }
                %>

            </select> 

                <%

                ResultSet rs1 = st.executeQuery("select * from proizvodi");

                %>

                <select name="proizvod">

                <%
                while(rs1.next())
                   {
                    String name1=rs1.getString(2);
                    String id1 = rs1.getString(1);
                %>

                <option value="<%=id1%>" ><%=name1%></option>

                <%
                   }
                %>

                </select> 
                <input type="submit" name="add" value="buy"/>
             </form>   


                <%

                if(request.getParameter("add")!=null)
                {
                    String user = request.getParameter("user");
                    String proizvod = request.getParameter("proizvod"); 
                    st.execute("insert into kupljeno(id, name, proizvod) values (null, '"+user+"', "+proizvod+")");

                }

                %>                                  


        <%-- <form action="index.jsp" method="post">
           <input type="submit" name="add" value="buy">

       </form> --%>    


    </body>
</html> 
4

2 に答える 2

2

あなたが述べた、

同時に、製品という別のテーブルから削除されます

また、あなたは言った、

テーブル 'kupljeno'[purchase] にも 2 つの外部キーがあります。'proizvod'[product] 列に配置され、テーブル 'proizvodi'[product] とその列 'id' を参照する別のもの。

テーブルの行に別のテーブルの行に対する fk 制約がある場合、最初のテーブルの行が削除されるまで、2 番目のテーブルの行は削除できません。外部キー制約に関するこの記事を読む必要があります。

なぜこれを行うのですか?悪いデザインです。製品テーブルから削除しないでください。

代わりに、コードでこれを制御して、必要に応じてユーザーが同じ製品を 2 回購入するのを防ぎます。MySQL に、すべきでないことを強制しないでください。あなたのコードが本来あるべきことをするようにしましょう!

于 2013-07-17T19:16:40.907 に答える
0

その外部キー列に値を提供する必要があります ( kupljeno テーブルでidは ではなく、奇妙な名前users_idです。通常、すべてのテーブルに主キーを追加しますが、このテーブルには含まれていないようです。

insert into kupljeno(id, name, proizvod) values (null, '"+user+"', "+proizvod+")"
                     ^^                          ^^^^

kupljeno別のテーブルへの外部キーではなく、テーブルの主キーであるかのように、テーブルで AUTO_INCREMENT 属性を使用して id 列を宣言したと思われます。

NULL 値を挿入しているのに、挿入しようとしている行に値があるためだと思われる理由。これは、列の AUTO_INCREMENT 属性が原因で割り当てられているか、(この場合はあまりありませんが) トリガーによって割り当てられています。

(実際に問題を特定するのに長い道のりになるのは、ステートメントを使用して簡単に取得できる ACTUAL TABLE DEFINTIONSSHOW CREATE TABLEです。)

あなたが本当に望んでいるのはusers、次のように、テーブルを参照する FOREIGN KEY から、テーブルの PRIMARY KEY を分離することです。

id          - primary key
user_id     - foreign key references user(id)
user_name   - (redundant, copied from user.name)
product_id  - foreign key to product(id)
于 2013-07-17T19:06:04.563 に答える