我正在使用与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
有人告诉我为什么会这样吗?
在任何情况下,您的第一个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
。