DBD :: SQLite :: st执行失败:ID不能为NULL

时间:2019-02-13 16:35:45

标签: sql sqlite perl dbi

我尝试使用Perl在SQLite数据库的表中插入一行。 该表具有一列ID,其中设置了AUTOINCREMENTPRIMARY KEY属性。

MY_TABLE模式中,这是有关ID字段的所有信息:

ID [INT AUTO_INCREMENT] NOT NULL,
PRIMARY KEY (ID)

我不想为添加的每个新行配置ID,因此我尝试了几种方法让数据库本身对其进行更新,但是我得到了:

  

DBD :: SQLite :: st执行失败:MY_TABLE.ID不能为空

use DBI;
my $db = DBI->connect("...");
my $sql = qq{
    insert into MY_TABLE (ID, col_b, col_c, col_d)
    values(?, ?, ?, ?)
}

my $st = $db->prepare($sql);
$st->execute(undef, 'val2', 'val3', 'val4');

我还尝试从查询和参数中完全跳过参数,但结果相同。用0代替undef会插入实际值(我不想,我想自动增加)。

我想念什么?

3 个答案:

答案 0 :(得分:2)

我怀疑您不应将空值传递给该列,而应该传递该列本身。

尝试:

use DBI;
my $db = DBI->connect("...");
my $sql = qq{
    insert into MY_TABLE (col_b, col_c, col_d)
    values(?, ?, ?)
}

my $st = $db->prepare($sql);
$st->execute('val2', 'val3', 'val4');

答案 1 :(得分:1)

正如其他地方提到的那样,正确的拼写是AUTOINCREMENT,而不是AUTO_INCREMENT,但是不要紧,您真正需要的是声明您的ID字段INTEGER PRIMARY KEY,就像这样 ,{ {1}}不够好,而且您通常也不需要INT关键字(请参见https://sqlite.org/lang_createtable.html下的内容),也不需要在AUTOINCREMENT中为ID指定任何内容声明。

答案 2 :(得分:1)

ID [INT AUTO_INCREMENT] NOT NULL,
PRIMARY KEY (ID)
  1. AUTOINCREMENT(非AUTO_INCREMEMENT)仅与INTEGER PRIMARY KEY列一起使用(并且通常不应该使用,因为它不执行名称所暗示的作用; {{3} })。
  2. 大多数sqlite表的主键是一个带符号的64位整数(details)。插入新行时,如果没有rowid值或NULL,则会自动生成一个新行(这是人们 think AUTOINCREMENT所做的,因为他们习惯了其他数据库的工作方式)。 INTEGER PRIMARY KEY列充当rowid的别名,并且行为相同。任何其他主键都等效于该列上的唯一索引。对于rowid别名,列亲和力必须为INTEGER。没什么像INTrowid

因此,基本上,将表定义更改为包含

id INTEGER PRIMARY KEY

相反,您可以将其保留在INSERT之外,也可以为其分配NULL,它将按您想要的方式工作。