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

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

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

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

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

我不想为添加的每个新行配置ID,因此我尝试了几种方法让数据库自己更新它,但我得到:

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

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插入实际值(我不想这样,我想自动递增)。

我错过了什么?

sql sqlite perl dbi
3个回答
1
投票

正如其他地方提到的,正确的拼写是AUTOINCREMENT,而不是AUTO_INCREMENT,但没关系,你真正需要的是声明你的ID字段INTEGER PRIMARY KEY,就像那样,INT不够好,你通常不需要无论如何AUTOINCREMENT关键字(请参阅https://sqlite.org/lang_createtable.html下),并且不要在INSERT语句中为ID指定任何内容。


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
投票
ID [INT AUTO_INCREMENT] NOT NULL,
PRIMARY KEY (ID)
  1. AUTOINCREMENT(不是AUTO_INCREMEMENT)只适用于INTEGER PRIMARY KEY列(并且通常不应该使用,因为它不做名称所暗示的; details)。
  2. 大多数sqlite表都有一个主键,它是一个带符号的64位整数(rowid)。当插入一个新行时,如果没有rowid值或者NULL,则会自动生成一个新的行(这是人们认为AUTOINCREMENT所做的,因为他们已经习惯了其他数据库的工作方式)。 INTEGER PRIMARY KEY列作为rowid的别名,行为方式相同。任何其他主键等同于该列上的唯一索引。对于rowid别名,列亲和力必须是INTEGER。没有别的,像INTMore reading

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

id INTEGER PRIMARY KEY

相反,你可以把它从INSERT,或指定NULL,它会按你想要的方式工作。

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