【问题标题】:Multiple conditions in an SQL Delete statement [closed]SQL Delete语句中的多个条件[关闭]
【发布时间】:2020-06-27 15:43:17
【问题描述】:

我将 java 与 mysql 结合用于 Web 应用程序。我想问一下这种说法是否行得通。

String delete="DELETE FROM `eoms`.`order` WHERE (`employeeID` = '"+eID+"', orderTime = '"+mealName+"', orderDate = '"+curDate+"');";

【问题讨论】:

  • 学习使用参数!不要用常量混淆查询字符串!
  • 不要将输入连接到 SQL 字符串中。了解如何使用 PreparedStatement
  • 确定 MySQL DELETE 语句是否“有效”的一种方法是首先将其编写为 SELECT 语句...SELECT o.* FROM eoms.order o WHERE ( o.emplyeeid = ? AND o.ordertime = ? AND o.orderdate = ? ),然后验证 select 语句是否“有效”并返回我们要删除的行。然后我们可以将 SELECT 关键字替换为 DELETE 关键字 ...(并呼应之前的建议,使用带有绑定占位符“小鲍比表”xkcd.com/327 的准备好的语句)
  • @Gordon,如果我不使用PreparedStatement会出现什么问题?

标签: java mysql sql sql-delete


【解决方案1】:

您应该将条件与and 运算符结合起来

String delete="DELETE FROM `eoms`.`order` WHERE (`employeeID` = '"+eID+"' and orderTime = '"+mealName+"' and orderDate = '"+curDate+"')";

按照建议,为您的参数使用准备语句以避免 SQL 注入

  String deleteQuery = "DELETE FROM `eoms`.`order` WHERE employeeID =? and orderTime =? and orderDate=? ";
  PreparedStatement preparedStmt = conn.prepareStatement(deleteQuery);
  preparedStmt.setInt(1, eID);
  preparedStmt.setInt(2, mealName);
  preparedStmt.setInt(3, curDate);   

  preparedStmt.executeUpdate();

  conn.close();

【讨论】:

    【解决方案2】:

    是的,您的删除查询应该可以工作,但您应该使用准备好的语句:

    String delete = "DELETE FROM `eoms`.`order` WHERE employeeID = ? OR orderTime = ? OR orderDate = ?";
    PreparedStatement ps = conn.prepareStatement(delete);
    ps.setInt(1, eID);
    ps.setTime(2, orderTime);
    ps.setDate(3, curDate);
    int row = ps.executeUpdate();
    System.out.println(row + " rows were deleted.");
    

    旁注:请避免使用保留的 SQL 关键字(例如 order)命名您的表(和其他数据库对象)。你将永远不得不在反引号中逃避你的order 表。此外,您似乎将订单时间和日期存储在单独的列中。这可能不是最佳实践,您应该考虑只为订单使用单个日期时间列。最后,也许您打算同时应用WHERE 子句中的所有三个限制。如果是这样,那么只需将OR 替换为AND

    【讨论】:

    • “您的删除查询应该可以工作”,而不是问题中显示的 where 子句。
    • @Mark 是的,你是对的......我想我下意识地过滤掉了逗号。
    猜你喜欢
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多