我尝试在SQLite数据库的表中使用Perl插入一行。该表有一个ID
列,其中包含AUTOINCREMENT
和PRIMARY 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
插入实际值(我不想这样,我想自动递增)。
我错过了什么?
正如其他地方提到的,正确的拼写是AUTOINCREMENT,而不是AUTO_INCREMENT,但没关系,你真正需要的是声明你的ID字段INTEGER PRIMARY KEY
,就像那样,INT
不够好,你通常不需要无论如何AUTOINCREMENT
关键字(请参阅https://sqlite.org/lang_createtable.html下),并且不要在INSERT
语句中为ID指定任何内容。
我怀疑你不应该将空值传递给列,而是不传递列本身。
试试:
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');
ID [INT AUTO_INCREMENT] NOT NULL,
PRIMARY KEY (ID)
AUTOINCREMENT
(不是AUTO_INCREMEMENT
)只适用于INTEGER PRIMARY KEY
列(并且通常不应该使用,因为它不做名称所暗示的; details)。NULL
,则会自动生成一个新的行(这是人们认为AUTOINCREMENT
所做的,因为他们已经习惯了其他数据库的工作方式)。 INTEGER PRIMARY KEY
列作为rowid的别名,行为方式相同。任何其他主键等同于该列上的唯一索引。对于rowid别名,列亲和力必须是INTEGER
。没有别的,像INT
。 More reading。因此,基本上,将表定义更改为包含
id INTEGER PRIMARY KEY
相反,你可以把它从INSERT
,或指定NULL
,它会按你想要的方式工作。