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 = ?;:读取字段用于计算更新后的KEYDATAUPDATE 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
相关产品推荐
相关产品推荐

