虽然插入正确,但外键约束失败

时间:2013-12-09 19:01:44

标签: mysql

我刚刚开始使用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;

          }
        }

    }

这是我们的错误:

  

您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以便在''1231231231231'附近使用正确的语法,'cola can',1.2,1.2,1.25,1.5.0)'在第2行   无法添加或更新子行:外键约束失败(BINFG21Assortiment,CONSTRAINT Assortiment_ibfk_3 FOREIGN KEY(artikelNr)REFERENCES Artikel({{ 1}})ON DELETE CASCADE ON UPDATE CASCADE)   您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第3行“'Delhaize'附近使用正确的语法”

1 个答案:

答案 0 :(得分:0)

我还没有找到错误,但请查看SQL注入(http://en.wikipedia.org/wiki/Sql_injection)和PreparedStatements。您的应用程序需要受到攻击,并且会在最轻微的无效输入时崩溃。

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

回到你的错误:看起来第一个语句失败,第二个语句属于由于第一个错误而未插入的记录。 查看用于SQL的String变量的内容,并将它们插入到像phpmyadmin这样的SQL-Tool中,以检查它是否可以执行。

相关问题