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

SQLite中如何在UPDATE语句的WHERE条件中引用表列的默认值

SQLite中如何在UPDATE语句的WHERE条件中引用表列的默认值

我来帮你排查下这个问题哈~你遇到的核心问题是:通过pragma_table_info查询出来的默认值,和你列里实际存储的默认值格式不一样!

你看,当你用pragma_table_info('Rate')查Nummer列的dflt_value时,返回的结果是带单引号的字符串(比如你的默认值是Default,查出来的会是'Default'),但你的Nummer列实际存储的默认值是不带外层单引号的Default。这就导致你在WHERE条件里用Nummer <> (SELECT defaultValue From DefaultValueCTE LIMIT 1)的时候,实际是在比较Default和'Default'——这两个肯定不相等啊,所以条件会成立,不该更新的默认值行也被更新了。

知道原因就好解决了,我们只需要把查询出来的dflt_value去掉前后的单引号就行,用replace或者trim函数都可以。修改后的SQL代码如下:

WITH DefaultValueCTE AS (
    -- 用replace去掉所有单引号,或者用trim(dflt_value, '''')只去掉前后的
    SELECT replace(dflt_value, '''', '') AS defaultValue
    FROM pragma_table_info('Rate')
    WHERE name = 'Nummer'
)
UPDATE Rate
SET Nummer = '0' || Nummer
WHERE Nummer NOT LIKE '0%'
  AND Nummer <> (SELECT defaultValue From DefaultValueCTE LIMIT 1);

你可以先单独跑一下CTE里的查询语句,看看处理后的defaultValue是不是和你列里实际的默认值一致:

SELECT dflt_value, replace(dflt_value, '''', '') AS cleaned_default
FROM pragma_table_info('Rate')
WHERE name = 'Nummer';

这样就能确认清理后的默认值是否正确啦。

另外还有个小建议:如果你的默认值可能包含单引号(虽然你这里是Default不包含),用trim(dflt_value, '''')会更稳妥,因为它只会去掉字符串首尾的单引号,不会影响内容里的单引号。

备注:内容来源于stack exchange,提问作者G.Don

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 08:49:31