要删除的正确sql语法是什么?

时间:2016-04-26 02:58:15

标签: sql syntax

我正在制作一个简单的电路板。我想删除一篇文章,在用户输入密码后,在DB one access中连接。

所以,我在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);

有人告诉我这是不正确的语法。但是,它正在发挥作用。

语法不正确吗?

2 个答案:

答案 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 语句的 语法 而言,它看起来对我有用。