在SQLite JDBC连接中插入寄存器的问题,不考虑主键

问题描述 投票:0回答:1

我正在使用与Java应用程序一起运行的sqlite 3.27.2版。我想知道当我尝试执行INSERT并且不尊重作为主键传递的值时会发生什么。

我将展示一个例子。

CREATE TABLE "test_insert_pk" (
    "code"  INTEGER NOT NULL,
    "number"    INTEGER,
    PRIMARY KEY("code")
);

INSERT INTO "test_insert_pk" ("code", "number") VALUES ('900','994-4432');

此插入由我的Java应用程序执行prepareStatement.execute();

查看结果可能会发现未考虑主键:result query on table INTEGER primary key

我意识到它总是在主键为INTEGER时发生,另一个将这种类型交换为VARCHAR的示例,插入了由参数传递的值。

CREATE TABLE "test_insert_pk2" (
    "code"  VARCHAR NOT NULL,
    "number"    INTEGER,
    PRIMARY KEY("code")
);

INSERT INTO "test_insert_pk2" ("code", "number") VALUES ('900','994-4432');

result query on table VARCHAR primary key

有人告诉我为什么会这样吗?

java sqlite jdbc insert spring-jdbc
1个回答
0
投票

在任何情况下,您的第一个insert查询都不会考虑code列的值。参见demo。当您将一列定义为INTEGER PRIMARY KEY时,该列也是AUTOINCREMENT。检查此:SQLite Autoincrement。因此,只有在您从插入语句中省略列code = 1的情况下,才用code = 900而不是code来获得结果:

INSERT INTO "test_insert_pk" ("number") VALUES ('994-4432');

请参见demo。或者,如果您将NULL作为其值传递:

INSERT INTO "test_insert_pk" ("code", "number") VALUES (null, '994-4432');

请参见demo。因此,请检查传递给PreparedStatement对象的参数。列code的参数可能将值设置为NULL,从而在表中得出1

© www.soinside.com 2019 - 2024. All rights reserved.