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
相关产品推荐
相关产品推荐

