我尝试使用Perl在SQLite数据库的表中插入一行。
该表具有一列ID
,其中设置了AUTOINCREMENT
和PRIMARY 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
会插入实际值(我不想,我想自动增加)。
我想念什么?
答案 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)
AUTOINCREMENT
(非AUTO_INCREMEMENT
)仅与INTEGER PRIMARY KEY
列一起使用(并且通常不应该使用,因为它不执行名称所暗示的作用; {{3} })。NULL
,则会自动生成一个新行(这是人们 think AUTOINCREMENT
所做的,因为他们习惯了其他数据库的工作方式)。 INTEGER PRIMARY KEY
列充当rowid的别名,并且行为相同。任何其他主键都等效于该列上的唯一索引。对于rowid别名,列亲和力必须为INTEGER
。没什么像INT
。 rowid。因此,基本上,将表定义更改为包含
id INTEGER PRIMARY KEY
相反,您可以将其保留在INSERT
之外,也可以为其分配NULL
,它将按您想要的方式工作。