【问题标题】:SQLite autoincrement - How to insert values?SQLite 自动增量 - 如何插入值?
【发布时间】:2012-01-05 06:05:59
【问题描述】:

我生成了一个 SQLite 表(在 java 中):

create table participants (ROWID INTEGER PRIMARY KEY AUTOINCREMENT, col1,col2);

之后我尝试使用 INSERT 命令添加行:

insert into participants values ("bla","blub");

我得到了错误:

java.sql.SQLException: table participants has 3 columns but 2 values were supplied

我以为行id会自动生成,但似乎我错过了什么。


我尝试了另一种解决方案:

PreparedStatement prep = conn.prepareStatement("insert into participants values (?,?,?);");
Integer n = null;
prep.setInt(1,n);
prep.setString(2, "bla");
prep.setString(3, "blub");
prep.addBatch();
prep.executeBatch();

结果我在“prep.setInt(1,n);”处收到了一个空指针异常

你看出错了吗?

【问题讨论】:

    标签: java sqlite auto-increment


    【解决方案1】:

    您是否尝试过指示您传递的参数应该与表的哪些字段相关?

    INSERT INTO table_name (column1, column2, column3,...)
    VALUES (value1, value2, value3,...)
    

    在你的情况下可能是这样的:

    INSERT INTO participants(col1, col2) VALUES ("bla","blub");
    

    【讨论】:

    • 我认为这可行,我找到了另一种好方法并编辑了问题!谢谢!
    • 这是正确的方法。这也不是特定于 SQLite。
    • 如果您正在执行架构迁移并使用 select 语句进行插入,您可以执行 insert into participants(col1, col2) select col1, col2 from t1_backup;
    【解决方案2】:

    不使用列名的最简单方法是 using null 代替 autoincreament 是这样的

    insert into table values (null, col1, col2)
    

    如果您已经将第一列设置为自动增量,它将正常工作。

    【讨论】:

      【解决方案3】:

      找到了一个可行的解决方案here

      PreparedStatement prep = conn.prepareStatement("insert into participants values ($next_id,?,?);");
      prep.setString(2, "bla");
      prep.setString(3, "blub");
      

      【讨论】:

        【解决方案4】:

        错误的原因是,当不使用列说明符时,SQL 插入希望您提供与表中的列相同数量的值。

        即当您编写这样的 SQL 查询时:

        INSERT INTO TableName VALUES(a1,a2, ...)
        

        .. 值的顺序必须与表定义中的顺序完全相同(并且数量也相同)。这样做的原因是为了避免歧义并减少错误的数量。

        在您的情况下,您有一个不想为其指定值的自动增量列。这当然是可能的,但是按照上面的规则你需要指定列名:

        INSERT INTO TableName (columnName1, columnName2) VALUES(Value1, Value2);
        

        【讨论】:

          猜你喜欢
          • 2019-09-09
          • 1970-01-01
          • 1970-01-01
          • 2011-04-19
          • 1970-01-01
          • 2016-03-19
          • 2021-11-19
          • 2011-07-15
          相关资源
          最近更新 更多