尝试更改 sqlite 数据库中字段的部分值

Trying to change partial value in a field in sqlite databse

我需要更新一个相当大的值的部分 sickbeard.db。 数据库中的一行看起来很简单:

"66"    "305288"    "1" "Stranger Things"   "/media/tv1/Stranger Thins" "Netflix"   "|Adventure|Drama|Fantasy|Horror|Mystery|"  "Scripted"  "50"    "3" "Friday 3:00 AM"    "Continuing"    "0" "0" "2016"  "0" "en"    "0"     "tt4574334" "737297"    "0"     ""  ""  "0" "0" "0" "3" 

在位置字段中,我需要更改的数据是“/media/tv1/Some 电视节目”,但我需要将其更改为“/media/TV/tv1/Some 电视节目”。此字段包含 /media/tv1 或 /media/tv2,我想添加电视,因此字段如下所示:/media/TV/tv1

我一直在尝试这个: UPDATE tv_shows SET location = replace( '/media/tv%', '%tv%', '%TV/tv%' ); 但它只会更改为 /media/tv%(之后会删除所有其他内容。)这当然会破坏应用程序。

我真的不想在 gui 中手动操作

UPDATE tv_shows SET location = replace(location, '/media/', '/media/TV/');

假设您要更改的列名为 location

首先,根据online documentation,参数如

replace(original, find, replacement)

替换不接受模式。请注意,必须将原始字符串显式传递给函数。 (没有获取原始字符串的自动上下文。)其次,如果您想确保原始字符串与特定模式匹配,例如您不在其他可能的匹配中进行替换,则需要 WHERE条款来限制选择。就像原来的字符串参数一样,没有根据参数应用自动条件...必须使用WHERE子句才能正确限制更新:

UPDATE tv_shows 
SET location = replace(location, '/media/tv', '/media/TV/tv')
WHERE location LIKE '/media/tv%'

注意:由于 replace() returns 原始字符串的匹配失败,因此对每一行执行此操作可能没有明显的负面影响,特别是如果您希望唯一的匹配项出现在路径字符串的开头。但是,最好包含一个适当的 WHERE 子句以使命令更高效(仅更新必要的内容)并限制错误代码的负面影响(如果您得到,则无需破坏 table 中的每一行表达错误,至少它只会被限制在一个子集)。