2016-07-12 4 views
-1

데이터베이스의 Product to Product 테이블을 추가하는이 코드는 있지만 둘 이상의 행을 추가하는 코드입니다. 위의 코드에서 볼 수 있듯이 제품이 다음 확인으로 삽입 테이블에 존재하지 않는 경우, 내가 확인하고 있습니다이 코드가 데이터베이스에 둘 이상의 행을 삽입하는 이유는 무엇입니까?

public int addProduct(Products product, String supplierName) { 

    //find a product 
    String checkAllProducts = "SELECT * FROM products WHERE product_name = ?"; 

    //Insert product and supplier id where supplier exist in suppliers table sql statement 
    String insertSql = "INSERT INTO products (product_name, product_type, supplier_id, number_of_stocks, price_per_unit, packaging_type) SELECT ?,?,suppliers.supplier_id,?,?,? FROM suppliers WHERE suppliers.supplier_name = ?"; 

    //Get connection 
    Connection conn = DbUtil.getConnection(); 

    //Resultset for checking existing products 
    ResultSet resultSet = null; 

    int inserted = 0; 

    try { 

     //Prepare check all products statement 
     allProducts = conn.prepareStatement(checkAllProducts); 
     allProducts.setString(1, product.getProductName()); 
     resultSet = allProducts.executeQuery(); 

     //If doesn't exist in products table 
     if (!resultSet.next()) { 
      //Prepare insert statement 
      addProduct = conn.prepareStatement(insertSql); 
      //Get product parameter's data 
      addProduct.setString(1, product.getProductName()); 
      addProduct.setString(2, product.getProductType()); 
      addProduct.setInt(3, product.getNumberOfStocks()); 
      addProduct.setBigDecimal(4, product.getPricePerUnit()); 
      addProduct.setString(5, product.getPackagingType()); 
      addProduct.setString(6, supplierName); 

      //Confirm insert 
      int confirmation = JOptionPane.showConfirmDialog(null, "Are you sure you want to insert this product?", "Insert Confirm", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); 
      if (confirmation == JOptionPane.YES_OPTION) { 
       //execute insert 
       inserted = addProduct.executeUpdate(); 
      } 

     }//Else don't insert and show error messages. 
     else { 
      JOptionPane.showMessageDialog(null, "Product already exists.", "Invalid insert.", JOptionPane.ERROR_MESSAGE); 
     } 

    } catch (SQLException ex) { 
     Logger.getLogger(ProductDAO.class.getName()).log(Level.SEVERE, null, ex); 
    } finally { 
     DbUtil.close(conn, allProducts, resultSet); 
     DbUtil.close(conn, addProduct, resultSet); 
    } 

    return inserted; 
} 

:

여기에 코드입니다. 성공적으로 추가 중이지만 둘 이상의 행이 추가됩니다. 예를 들어, productDao 객체를 초기화했고이 방법으로 테스트했습니다 : productDAO.addProduct(new Products("Hotdogs", "Full", 55, new BigDecimal(0.30), "Box"), "Wing Yip");. 그렇게 한 후 아래의 이미지 링크에서 볼 수있는 것처럼 14 개의 이미지가 삽입되었습니다. 이런 일이 왜

14 Duplicate Rows

는 아는 사람 있나요? 제게 고마워요.

+0

삽입물이 '선택'문장의 결과를 삽입하고 있습니다. 아마도 이것을 의미하는 것이 아닙니다. 그리고이'select '는 당신이 검사하고있는 것과 같은'select'가 아닙니다 –

+0

@ Skary Wombat인가요? 글쎄, 나는'supplier_id'를 삽입하고 싶습니다. 당신이 말한 것은 제 의도는 아닙니다. 내 진술이 틀렸어? –

+1

'SELECT?,?, suppliers.supplier_id,?,?,? '를 실행 해보십시오. FROM 제품, 공급 업체 where products.supplier_id = suppliers.supplier_id 및 suppliers.supplier_name =? ";'별도로 어떤 결과를 얻었는지 확인 –

답변

0

당신의 삽입 성명의 두 번째 부분은 select 문입니다. 분명히 공급 업체에는 14 개의 제품이 있으므로 삽입되는 새 레코드 수는 얼마입니까?

이 문제를 해결하려면 암시적인 JOIN을 제거하십시오. supplier_id 조회에는 필요하지 않습니다.

INSERT INTO products (
    product_name, 
    product_type, 
    supplier_id, 
    number_of_stocks, 
    price_per_unit, 
    packaging_type 
) SELECT 
    ?, ?, 
    suppliers.supplier_id, 
    ?, ?, ? 
FROM suppliers 
WHERE suppliers.supplier_name = ? 
+0

제 문이 올바르지 만'LIMIT 1'이 추가되었습니다. –

+0

. 해결 방법 중 하나는 DISTINCT 공급 업체 .supplier_id'하지만, 쿼리가 필요한 것보다 더 많은 작업을 수행합니다. – 4castle

+0

답변을 좋아해요. 정말 고마워요. 코드를 최소화하기 위해 INSERT INTO SELECT 문을 수행하려고합니다. 정말 고마워요. –

0

@ Skary Wombat 및 @ 4castle에게 도움을 주신 데 감사드립니다. 지금 내가 한 것은 별도의 구문을 작성하고 아래에서 볼 수있는 것처럼 더 많은 코드를 추가 한 것입니다.

//find supplier 
String checkSupplierQuery = "SELECT products.supplier_id FROM products, suppliers WHERE products.supplier_id = suppliers.supplier_id AND suppliers.supplier_name = ? "; 

//Prepare check supplier statement 
PreparedStatement checkSupplier = conn.prepareStatement(checkSupplierQuery); 
checkSupplier.setString(1, supplierName); 
resultSet = checkSupplier.executeQuery(); 

String supplier = ""; 
while (resultSet.next()) { 
    supplier = resultSet.getString("products.supplier_id"); 
} 

내 문제를 해결하지만 난 예상대로 작동하지 않았다 INSERT INTO SELECT 문을 시도하고있다. 나를 도운 사람들에게 다시 한번 감사드립니다.

SELECT 
    ?, ?, 
    suppliers.supplier_id, 
    ?, ?, ? 
FROM products, suppliers 
WHERE 
    products.supplier_id = suppliers.supplier_id 
    AND suppliers.supplier_name = ? 

이 그 업체의 이름을 모두 테이블에 나타나는 모든 레코드를 선택 할 수있는 기능이 있습니다 :-)

관련 문제