2013-12-09 47 views
1

我刚刚开始使用SQL,并在运行我的文件时发生此问题。 表Artikel中的主键是artikelNr,而表Assortiment有一个多重键,即artikelNr和winkelNaam。我们已经在互联网上搜索,但没有找到任何有用的信息。提前致谢!外键约束失败,尽管插入正确

这是Java我们的SQL代码:

public void addArtikel(String artikelNr, String artikelNaam, double prijs, double aantalBonuspunten, double aantalBonuspuntenNodig,int minAantalStuks, double minBedrag) 
{ 
    Database db = new Database(); 
    Connection con = null; 
    try 
    { 
     con = db.getConnection(); 
     Statement stmt = con.createStatement(); 
     String sql = "INSERT INTO Artikel\n" +"VALUES(‘" + artikelNr + "’, ‘" + artikelNaam + "’, " + prijs + ", " + aantalBonuspunten + ", " + aantalBonuspuntenNodig + ", " + minAantalStuks + "," + minBedrag + ");"; 
     stmt.executeUpdate(sql); 
     con.close(); 
    } 
    catch(Exception ex) 
    { 
     try { con.close(); } catch(Exception ex2){}; 
     System.out.println(ex.getMessage()); 
    } 
} 

public void addAssortiment(String artikelNr, String winkelNaam) 
{ 
    Database db = new Database(); 
    Connection con = null; 
    try 
    { 
     con = db.getConnection(); 
     Statement stmt = con.createStatement(); 
     String sql = "INSERT INTO Assortiment\n" +"VALUES('" + artikelNr+ "', '" + winkelNaam + "');"; 
     stmt.executeUpdate(sql); 
     con.close(); 
    } 

    catch(Exception ex) 
    { 
     try { con.close(); } catch(Exception ex2){}; 
     System.out.println(ex.getMessage()); 
    } 
} 

这是我们的Java代码:

public void artikelToevoegen(String winkelnaam) 
    { 
     String artikelNr = io.readString("Geef de barcode van het artikel dat u wilt toevoegen: "); 
     while(artikelNr.length() != 13) 
     { 
      artikelNr = io.readString("Ongeldige barcode. Een barcode bestaat uit 13 karakters. Probeer opnieuw: "); 
     } 
     String naam = io.readString("Geef naam artikel"); 
     double prijs = io.readDouble("Geef prijs artikel"); 
     double aantalBonuspunten = io.readDouble("Geef het aantal punten per artikel (niet per euro van de prijs!)" + "\ndie men krijgt bij aankoop van het artikel (als de vereisten voldaan zijn)." 
       + "\nDe punten moeten tussen 0,25 en 2 per euro van de prijs liggen." 
       +"\nIndien dit aantal 0 is typ null." 
       + "\nIndien het artikel niet aan deze vereisten voldoet, wordt het automatisch verwijderd."); 
     int minAantalStuks = io.readInt("Geef het minimum aantal stuks dat gekocht moet worden van het artikel" +"\n eer men de bijhorende punten verkrijgt, indien er geen vereist aantal is typ 1"); 
     double aantalBonuspuntenNodig = io.readDouble("Geef het aantal punten per artikel (niet per euro van de prijs!) die nodig zijn om het artikel gratis te verkrijgen (indien aan de voorwaarden voldaan is)." 
       + "\n De punten moeten tussen 0,25 en 2 per euro van de prijs liggen." + "\n Indien dit aantal 0 is typ null." + 
       "\n Indien het artikel niet aan deze vereisten voldoet, wordt het automatisch verwijderd."); 
     double minBedrag = io.readDouble("Geef het minimum bedrag dat van het artikel aangekocht moet worden eer men het artikel met punten kan verkrijgen," + "\n indien er geen minimumbedrag is geef de eenheidsprijs."); 
     db.addArtikel(artikelNr, naam, prijs, aantalBonuspunten, aantalBonuspuntenNodig, minAantalStuks, minBedrag); 
     db.addAssortiment(artikelNr, winkelnaam); 
     int keuze = io.readInt("Wilt u nog een artikel toevoegen?" + 
          "\n1)Ja" + "\n2)nee"); 
     while(keuze<1||keuze>2) 
     { 
      keuze = io.readInt("Ongeldige keuze, probeer opnieuw" + "\nWilt u nog een artikel toevoegen?" + 
          "\n1)Ja" + "\n2)nee"); 
     } 
     while(keuze != 2) 
     { 
      switch(keuze) 
     { 
      case 1: artikelToevoegen(winkelnaam); 
        break; 

      } 
     } 

    } 

这是我们的错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '‘1231231231231’, ‘cola can’, 1.2, 1.2, 1.25, 1,5.0)' at line 2 Cannot add or update a child row: a foreign key constraint fails (BINFG21 . Assortiment , CONSTRAINT Assortiment_ibfk_3 FOREIGN KEY (artikelNr) REFERENCES Artikel (artikelNr) ON DELETE CASCADE ON UPDATE CASCADE) You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '‘Delhaize’)' at line 3

回答

0

我没发现错误,但请查看SQL注入(http://en.wikipedia.org/wiki/Sql_injection)和PreparedStatements。你的应用程序乞求被攻击,它会在最轻微的无效输入时崩溃。

Prepared Statement还有助于避免这些丑陋的语法错误,因为它们具有更好的可读性。

回到您的错误:看起来第一条语句失败,第二条语句属于未插入的记录,因为第一个错误。 查看用于SQL的字符串变量的内容,并将它们插入像phpmyadmin这样的SQL工具来检查它是否可以执行。

+0

非常感谢!我们发现错误! – user3083991

+0

你可以请你发布你解决它的方式吗?这将有助于他人理解。 – rulebot

+0

出错的主要原因是apotrophe的差异。我们用马克来实现,但是我们的程序不能识别这些撇号。但是还有很多其他的错误。 – user3083991