【问题标题】:DBD::SQLite::st execute failed: ID may not be NULLDBD::SQLite::st 执行失败:ID 可能不为 NULL
【发布时间】:2019-07-07 13:58:22
【问题描述】:

我尝试使用 Perl 在 SQLite 数据库的表中插入一行。 该表有一列 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 会插入实际值(我不想这样做,我想自动递增)。

我错过了什么?

【问题讨论】:

  • 可以分享一下表格结构吗?您可以从 sqlite 命令行执行 .schema MY_TABLE; 并使用输出更新您的问题。
  • @GMB 我添加了ID 字段的信息,很遗憾,无法分享更多信息。
  • 如果没有完整的表定义,就很难准确判断出了什么问题。为什么不能分享更多?您可以将不想分享的信息设为匿名。
  • 另外,AUTO_INCREMENT 在 sqlite 中应该是 AUTOINCREMENT

标签: sql sqlite perl dbi


【解决方案1】:

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

试试:

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');

【讨论】:

  • @GarryWhite:我忘了删除一个额外的?。请立即重试。
  • I also tried to skip the paramter completely from the querry and from the parameters but same results ...我也想过,但它抛出了同样的错误
【解决方案2】:

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

【讨论】:

  • 显然我收到的数据库被错误地配置为[INT AUTO_INCRMEENT]。我什至不认为我应该先检查一下...谢谢!
【解决方案3】:
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 分配给它,它会按照您想要的方式工作。

【讨论】:

  • 谢谢肖恩,@varro 已经回答了这是错误的。我收到了数据库,但我没有考虑检查它是否正确设置。
猜你喜欢
  • 1970-01-01
  • 2023-04-11
  • 2020-06-01
  • 2014-11-09
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
  • 2016-10-30
相关资源
最近更新 更多