0

我正在为学校目的构建一个简单的基于 Web 的应用程序,它应该使某些用户能够购买他们从下拉菜单中选择的某些产品。每当用户点击购买他们从下拉菜单中选择的产品时,该产品就会存储到已购买项目表中,同时会从另一个名为 products 的表中删除。据我所知,为了能够做到这一点,我需要有 3 个表:用户、产品、购买,在购买表中我应该有 2 列外键,对于购买者来说是 #1,对于购买者来说是 #2购买的产品。我以为我解决了这个问题,但我的 glassfish 服务器不断向我抛出以下错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:
无法添加或更新子行:外键约束失败
(`webprodaja`.`kupljeno`,约束`kupljeno_ibfk_1`外键(`id`)参考users(`id` ))

好的,这是有问题的表和外键:

表“用户”:

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

表“proizvodi”(英语产品):

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

表“kupljeno”(英文购买):

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

你说,

同时从另一个名为 products 的表中删除

你还说,

表 'kupljeno'[purchase] 也有 2 个外键:一个放在 'id' 列上并引用表 'users' 及其列 'id';另一个放在“proizvod”[product] 列并引用表“proizvodi”[product] 及其列“id”;

当一个表的行对另一个表的行有 fk 约束时,在删除第一个表的行之前,不能删除第二个表的行。你应该阅读这篇关于外键约束的文章。

为什么要这样做?这是糟糕的设计。不要从产品表中删除。

而是使用您的代码来控制它,以防止用户在需要时购买相同的产品两次。不要强迫 MySQL 做它不应该做的事情;让你的代码做它应该做的!

于 2013-07-17T19:16:40.907 回答
0

您确实需要在 kupljeno 表中提供该外键列的值(而id不是users_idkupljeno 表中的奇怪名称。而且我们通常在每个表上添加一个主键,而这个表似乎没有。

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

我怀疑您已经在表中声明了具有 AUTO_INCREMENT 属性的 id 列kupljeno,就好像它是表的主键,而不是另一个表的外键。

我怀疑的原因是,因为您正在插入一个 NULL 值,但试图插入的行有一个值。这要么是因为列上的 AUTO_INCREMENT 属性而被分配的,要么是(在这种情况下不太可能)它是由触发器分配的。

(实际识别问题的方法是实际表定义,可以使用SHOW CREATE TABLE语句轻松获得。)

我认为您真正想要的是将表的 PRIMARY KEY 与引用该users表的 FOREIGN 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 回答