【问题标题】:Getting Exception With DB2 Auto Increment使用 DB2 自动增量获取异常
【发布时间】:2020-04-05 06:57:36
【问题描述】:

我创建了下表:

"CREATE TABLE ParsonCollection "
                + "(id integer not null GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1),"
                + "name varchar(20),"
                + "eye varchar(20),"
                + "hair varchar(20),"
                + "height varchar(20),"
                + "weight varchar(20),"
                + "PRIMARY KEY (id))";

然后我尝试插入表格,这就是我遇到问题的地方。当我尝试更改“id”列时,我收到一条错误消息“java.sql.SQLSyntaxErrorException: Attempt to modify an identity column 'ID'。”插入语句如下所示:

"insert into ParsonCollection values(" + q_surround(Name) + ","
            + q_surround(Eye) + "," + q_surround(Hair) + "," + q_surround(Height) + "," + q_surround(Weight) + ",1" + ")";

但是,当我删除插入“id”的字段时,我收到以下错误:“java.sql.SQLSyntaxErrorException:分配的值的数量与指定或隐含的列数不同。 "下面是这个插入语句的样子:

"insert into ParsonCollection values(" + q_surround(Name) + ","
            + q_surround(Eye) + "," + q_surround(Hair) + "," + q_surround(Height) + "," + q_surround(Weight) + ")";

我该如何克服这个问题?似乎当我解决一个异常时,会弹出另一个异常,反之亦然。谢谢。

【问题讨论】:

  • .... 请注意,您正在执行的字符串连接容易受到 SQL 注入的攻击。虽然它不能解决您当前的问题,但您应该使用 Prepared Statement。

标签: java sql jdbc netbeans db2


【解决方案1】:

出于兴趣,另一种解决方案是将标识列设为IMPLICITLY HIDDEN

【讨论】:

    【解决方案2】:

    您不能分配给标识列。由于不能为插入传递所有值,因此需要枚举列(省略标识列):

    "insert into ParsonCollection (
        name,
        eye,
        hair,
        height
        weight
    ) values(" 
        + q_surround(Name) 
        + "," + q_surround(Eye) 
        + "," + q_surround(Hair) 
        + "," + q_surround(Height)
        + "," + q_surround(Weight)
    + ")";
    

    旁注:您的代码对 SQL 注入开放。您应该认真考虑使用准备好的语句和绑定参数,而不是连接查询字符串。

    【讨论】:

    • 什么,对 SQL 注入漏洞没有评论?
    • @Clockwork-Muse:你肯定是对的。我的答案中添加了警告。
    • 谢谢你,这有效。顺便说一句,我不使用准备好的陈述的原因是因为我的教授不允许我们这样做,而且他没有教他们。
    猜你喜欢
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 2013-02-28
    • 2016-10-08
    • 1970-01-01
    • 2010-11-25
    • 2012-10-18
    • 2012-10-24
    相关资源
    最近更新 更多