2013-07-17 3 views
0

저는 학교 사용자를 위해 드롭 다운 메뉴에서 특정 제품을 구입할 수있는 간단한 웹 기반 응용 프로그램을 구축하고 있습니다. 사용자가 클릭하여 드롭 다운 메뉴에서 선택한 제품을 구입할 때마다이 제품은 구입 한 항목 테이블에 저장되고 동시에 제품이라고하는 다른 테이블에서 제거됩니다. 내가 아는 바로는이 작업을 수행 할 수 있으려면 사용자, 제품, 구매 등 3 개의 테이블이 있어야하며 구매 테이블에는 구입자가 # 1 인 외래 키가 2 열 있어야하고 구입 한 제품.외래 키 MySQL 데이터베이스

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException :
추가 또는 자식 행을 업데이트 할 수 없습니다 : 외래 키 제약 조건을 나는이 문제를 해결하지만 내 글래스 피쉬 서버 나 다음과 같은 오류를 던지고 계속 생각

:

좋아, 여기에 문제의 테이블과 외래 키는
(FOREIGN KEY이 (`id`가) users를 (`id`) 참고 문헌 kupljeno_ibfk_1``webprodaja`.`kupljeno`, 제약 조건을`) 실패

테이블 '사용자':

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

테이블 'proizvodi'(eng. 제품) :

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

테이블 'kupljeno'(ENG 구매).

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

테이블 'kupljeno'도 2 외래 키가 다음 'ID'에 넣어

하나 'users'테이블과 'id'컬럼을 참조합니다.

또 다른 하나는 'proizvod'열에 배치되고 'proizvodi'테이블과 해당 열 'id'를 참조합니다.

그래서 내가하려는 것은 구매자가 선택한 제품을 삭제하고 'proizvod'열에서 해당 이름을 삭제하고 동일한 제품을 'kupljeno'열에 넣는 것입니다. 그러나 구매를하고 'kupljeno'열에 세부 정보를 저장할 수 있었지만 'proizvod'열에서 구입 한 제품을 삭제할 수없는 이유가 있습니다. kupljeno에, 당신은 정말 외래 키 컬럼에 대한 값 (오히려 이상한 오히려 users_id보다 id 이름을 제공해야

<%@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> 
+0

제품 테이블에서 제품을 삭제 한 이유는 무엇입니까? – amaster

+0

'proizvodi'테이블에서 구입 한 제품을 'kupljeno'테이블에 넣은 다음 구입 한 제품을 제거하여 구매 한 것으로 보이고 더 이상 사용할 수 없게하려고합니다. 제품의 ID를 복사하여 'kupljeno'테이블의 참조 열에 저장 한 다음 'proizvodi'테이블에서 해당 값을 삭제하려면 어떻게해야합니까? –

+0

그래서 한 사용자가 제품을 구매할 때 다른 사용자가 더 이상 제품을 구입할 수 없습니까? 이것이 효과가 있기 때문입니다. – amaster

답변

0

:

또한, 여기 가치가 무엇인지에 대한 전체 index.jsp를 코드입니다 테이블. 그리고 우리는 일반적으로 이것을 가지고하지 않는 것 모든 테이블에 기본 키를 추가합니다.

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

을 난 당신이 kupljenot에서 AUTO_INCREMENT 속성과 id 컬럼을 선언 한 것으로 의심 다른 테이블에 대한 외래 키가 아닌 테이블의 기본 키인 것처럼 사용할 수 있습니다.

NULL 값을 삽입 했으므로 삽입하려고 시도하는 행에 값이 있기 때문에 그럴 것이라고 생각합니다. 이는 열의 AUTO_INCREMENT 특성으로 인해 할당되었거나 트리거에 의해 할당되는 것입니다 (이 경우에는 가능성이 적음).

(쉽게 SHOW CREATE TABLE 문을 사용하여 얻을 수 실제로 실제 표되어 정의 될 문제를 식별하는 데 오랜 길을 갈 것입니다 무엇.)

가 내가 생각하는 당신이 정말로 원하는 것은 기본 키를 분리하는 것입니다 이처럼 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) 
+0

'kupljeno.id'열의 섞인 ID 값은 사용자/제품 테이블에있는 ID를 저장합니다. 기본 키가 필요하지 않습니다.이 테이블의 목적은 누가 샀는지를 보여주는 것입니다. 값을 오름차순으로 넣으십시오. 내가하고 싶은 것은 'proizvodi'테이블의 값을 없애고 사용자가 어떤 제품을 구입했는지에 따라 'kupljeno'테이블에 동일한 값을 넣는 것입니다. 그것은 충분히 쉬워야한다. 그러나 나는이 문제를 다루는 데 젖어지고 있기 때문에이를 해결하는 방법에 대한 아이디어가 필요하다. 나는 외국 열쇠 해결책에 대해서 들었다. 누구? –

+0

@Ivan 태그 : insert 문에서 id 열에 NULL 값을 할당합니다. 따라서이 값은 테이블에서 NULL이어야합니다. 그러나 NULL 값은 예외를 던지지 않습니다.그러나'users.id' 열에 NOT FOUND 인 id 값을 가진 행을 삽입하려고하면 해당 예외가 throw됩니다. 지금까지 이것을 디버깅하는 방법에 관해서는, 예외를 던지는 문장의 정확한 SQL 텍스트를 찾아 내라. 귀하가 게시 한 코드에서 예외를 던질 수있는 유일한 문은 INSERT입니다. – spencer7593

2

,

과 같은 TI의

'ID'열을 넣어 하나 : 나를 호출 제품

또한 당신이 말한,

테이블 'kupljeno'[구매]도 2 외래 키가있는 다른 테이블에서 제거됩니다 'users'테이블과 'id'컬럼을 참조합니다. 'proizvod'[제품] 열에 놓여 있고 'proizvodi'[product] 테이블과 'id'열을 참조하는 또 다른 제품입니다.

테이블의 행에 다른 테이블의 행에 대한 제약 조건이있는 경우 첫 번째 테이블의 행이 삭제 될 때까지 두 번째 테이블의 행을 삭제할 수 없습니다. 외래 키 제약 조건에 대해서는 this 문서를 읽어야합니다.

왜 이런가요? 그것은 나쁜 디자인입니다. 제품 테이블에서 제거하지 마십시오.

대신 사용자가 원하는 경우 동일한 제품을 두 번 구매하지 못하도록 코드로 제어하십시오. MySQL이 강제로하지 말아야 할 일을하도록 강요하지 마십시오. 코드가해야 할 일을하도록하십시오!

+0

명시된 바와 같이, 이것은 명확한 지침을 제공 한 제 학교 프로젝트를위한 것입니다. 'proizvodi'테이블에서 항목을 가져 와서 'kupljeno'테이블에 넣으면 구매가 이루어진 것처럼 보입니다. 특정 행을 제거하고 다른 열에 저장하기 위해 코드를 재생해야합니다. 이것을 어떻게 성취합니까? –

+0

구매 테이블에서 외래 키를 제품 테이블로 제거한 다음 구입 테이블에 삽입하고 제품 테이블 – amaster

+0

에서 삭제할 수 있어야합니다. 문제를 부분적으로 해결 했으므로 GlassFish가 더 이상 오류를 던지지 않고 데이터를 가져옵니다. 바인딩 'kupljeno'테이블에 저장됩니다. 지금하고 싶은 것은 'proizvodi'에서 항목을 제거하고 'kupljeno'테이블에 넣는 것입니다. –