You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl DBI+SQLite单字段UPDATE报错:非空字段不可为NULL

仅更新SQLite单个字段时触发NOT NULL约束报错的问题

我在用Perl DBI编写首个SQLite程序时,执行预编译语句UPDATE KEYS SET KEYDATA = ? WHERE NAME = ?;更新单条记录的单个字段,却收到报错KEYS.KEK_DATA may not be NULL。KEK_DATA字段确实带有NOT NULL约束,但待更新的记录中该字段已填充数据,且通过查询确认不存在KEK_DATA为空的记录。

我想确认:仅指定要修改的字段执行UPDATE是否存在认知误区?如果为了避免报错而先SELECT读取所有字段再全部设置,操作显得过于冗余。

使用环境:SQLite 3.93.3、Perl 5.18.2(Linux x86_64)

详情

表定义

表名为KEYS,待更新字段为KEYDATA,报错字段为KEK_DATA:

CREATE TABLE KEYS (
ID              INTEGER PRIMARY KEY AUTOINCREMENT       NOT NULL,
NAME            VARCHAR(30)                             NOT NULL,
DK_DATA         VARCHAR(128)                            NOT NULL,
KEK_DATA        VARCHAR(128)                            NOT NULL,
KEYDATA         VARCHAR(4096)                           NOT NULL,
CREATOR         VARCHAR(20),
CREATED         DATETIME,
MODIFIED        DATETIME,
LOCKED          DATETIME);

触发器

定义了两个触发器:

CREATE TRIGGER KEY_CREATED AFTER INSERT ON KEYS FOR EACH ROW
BEGIN
  UPDATE KEYS SET CREATED = datetime('now') WHERE ID = new.ID;
END;
CREATE TRIGGER KEY_MODIFIED AFTER UPDATE ON KEYS FOR EACH ROW
BEGIN
  UPDATE KEYS SET MODIFIED = datetime('now') WHERE ID = new.ID;
END;

执行的SQL语句

触发问题的两条语句:

  • SELECT DK_DATA, KEK_DATA FROM KEYS WHERE NAME = ?;:读取字段用于计算更新后的KEYDATA
  • UPDATE KEYS SET KEYDATA = ? WHERE NAME = ?;:更新KEYDATA字段的语句

样本记录

引发问题的样本记录:

INSERT INTO KEYS VALUES(62,'2','RVYAAQATAhFkdvSkrEyDbbTUnFHfZWEABAExAAUEMTYABAAxAAcDNTA1Nw==','RVYAAQATDWMY2Y1l1PHWU2qrobycBekABAoyABMM04kRSihvavmUHJi4OzhzugAEADEABQsxNg==','RVYAAQAEADEABAcwABMJ5RVnT9DFN0+naro0L6N7Sg==','proc','2023-03-26 00:06:24','2023-03-26 00:06:24',NULL);

错误信息

原始DBI::errmsg:KEYS.KEK_DATA may not be NULL

空值检查

查询确认无KEK_DATA为空的记录:

sqlite> SELECT COUNT(*) FROM KEYS WHERE KEK_DATA IS NULL;
0

内容的提问来源于stack exchange,提问作者U. Windl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:32:49