所以,我在DAO类中创建了一个方法。这是查询部分。
sql.append("DELETE FROM article ");
sql.append("WHERE ? = (SELECT pwd FROM article WHERE no = ?) and no = ?");
pstmt = conn.prepareStatement(sql.toString());
pstmt.setString(1, pwd);
pstmt.setInt(2, no);
pstmt.setInt(3, no);
有人告诉我这是不正确的语法。但是,它正在发挥作用。
语法不正确吗?
答案 0 :(得分:0)
我认为你的陈述中有不必要的子查询。为什么不简化查询:
sql.append("DELETE FROM article WHERE no = ?");
pstmt = conn.prepareStatement(sql.toString());
pstmt.setInt(1, no);
答案 1 :(得分:0)
问:语法不正确吗?
SQL DELETE语句的语法看起来有效。关于语法,它没有什么“不正确”,因为它是准备和执行的有效SQL语句。
但是,看起来确实不需要子查询。我相信在没有子查询的情况下可以实现相同的结果。在没有子查询的情况下,我们倾向于编写一个更简单的语句。但这并不会使你的陈述语法“不正确”。
我们没有看到包含子查询的原因。为什么这个陈述不能达到相同的结果呢?
DELETE FROM article WHERE pwd = ? AND no = ?
如果(当)子查询返回多行时,大多数(所有?)关系数据库将抛出错误。 (我们不保证no
表中article
是唯一的。)
如果pwd
列中的值为NULL,则WHERE子句中的相等比较“pwd = ?
”将计算为NULL。因此,此语句不可能删除具有pwd
的NULL值的行。 (需要修改该语句以允许删除pwd
列的NULL值的行。)
我们没有看到任何初始化sql
的Java代码。我们假设有一个前一行将sql
的内容设置为零长度字符串,或空白和/或有效的SQL注释。为什么不呢
sql = "DELETE FROM article"
+ " WHERE pwd = ?"
+ " AND no = ?";
在样式注释中,当我动态生成一个语句,将附加的SQL语法附加到现有字符串时,我倾向于在我正在添加的字符串的开头中包含空格,不在我要添加的 end 。
如果pwd
列是“密码”,我们假设存储的是散列值,而不是明文。
我们假设这个块在“try / catch / finally”块中。
我们可以对代码有一些狡辩。
但就SQL DELETE 语句的 语法 而言,它看起来对我有用。