【发布时间】:2017-03-02 17:18:56
【问题描述】:
我有一个 SQLite 数据库,其中“事务”表包含一个 ID 字段,该字段是主键并且是自动递增的。
CREATE TABLE transactions (
id int AUTO_INCREMENT not null,
time DATETIME not null,
buyer varchar(320) not null,
seller varchar(320) not null,
price float not null,
size int not null,
currency char(3) not null,
symbol varchar(10) not null,
primary key (id)
);
我创建了一个 Java 类来处理 SQL 查询。
try {
PreparedStatement pStmt = db.getConnection().prepareStatement(
"INSERT INTO transactions( id, time, buyer, seller, price, size, currency, symbol ) " +
"VALUES ( ?, ?, ?, ?, ?, ?, ?, ? )"
);
java.util.Date uDate = sdf.parse( curLine[0] );
try {
pStmt.setLong( 2, uDate.getTime() );
pStmt.setString( 3, curLine[1] );
pStmt.setString( 4, curLine[2] );
pStmt.setFloat( 5, Float.parseFloat( curLine[3] ) );
pStmt.setInt( 6, Integer.parseInt( curLine[4] ) );
pStmt.setString( 7, curLine[5] );
pStmt.setString( 8, curLine[6] );
pStmt.executeUpdate();
} catch( SQLException e ) {
e.printStackTrace();
}
} catch ( SQLException e ) {
e.printStackTrace();
}
curLine 是从 CSV 文件解析的值数组。
在运行时,我有以下错误
org.sqlite.SQLiteException: [SQLITE_CONSTRAINT_NOTNULL] NOT NULL 约束失败(NOT NULL 约束失败:transactions.id)
我不知道如何处理它。
我尝试了其他几种配置:
- 不要在sql查询中指明“id”字段。
- 为“id”赋予 0 值。
但是这些配置中的每一个都会引发错误。
【问题讨论】:
-
非常不言自明,您将
null传递给不接受null的列的参数(当前,任何列)。如果不显示更多代码,很难说是哪个,但总体而言,数组很可能在没有设置特定索引的情况下被初始化(因此默认为 null)。这是您调试代码的地方(添加打印语句并查看正在传递的当前值)。 -
但我不想将任何值传递给
id,因为它是一个自动增量字段。所以我希望它表现得像一个正常的自动增量字段。 -
您是自己执行 CREATE TABLE 语句,还是应该是已经存在的 SQLite 表的 DDL?
-
@GordThompson 该表是在终端进程中单独创建的。