我刚刚开始使用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行 无法添加或更新子行:外键约束失败(
BINFG21
。Assortiment
,CONSTRAINTAssortiment_ibfk_3
FOREIGN KEY(artikelNr
)REFERENCESArtikel
({{ 1}})ON DELETE CASCADE ON UPDATE CASCADE) 您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第3行“'Delhaize'附近使用正确的语法”
答案 0 :(得分:0)
我还没有找到错误,但请查看SQL注入(http://en.wikipedia.org/wiki/Sql_injection)和PreparedStatements。您的应用程序需要受到攻击,并且会在最轻微的无效输入时崩溃。
Prepared Statement还有助于避免这些丑陋的语法错误,因为它们具有更好的可读性。
回到你的错误:看起来第一个语句失败,第二个语句属于由于第一个错误而未插入的记录。 查看用于SQL的String变量的内容,并将它们插入到像phpmyadmin这样的SQL-Tool中,以检查它是否可以执行。