SQLite中通过Element表Name更新Line表length字段的问题
解决SQLite通过关联表更新字段的问题
针对你的需求,这里提供两种可靠的写法,同时解释你之前遇到的问题:
方法1:使用IN子查询
先从Element表筛选出目标Name对应的Element_ID,再更新Line表中匹配的行:
UPDATE Line SET length = 2 WHERE Element_ID IN ( SELECT Element_ID FROM Element WHERE Name = 'c18' );
方法2:正确使用EXISTS子查询
关键是要在EXISTS的子查询里关联外层Line表的Element_ID,确保只更新匹配的行:
UPDATE Line SET length = 2 WHERE EXISTS ( SELECT 1 FROM Element WHERE Element.Element_ID = Line.Element_ID AND Element.Name = 'c18' );
你之前写法的问题分析
- 第一种写法报错
Error: No such column: Element.Element_ID:大概率是子查询里没有正确关联外层Line表,或者没有明确指定Element表的字段归属(比如子查询里的表别名缺失,导致SQLite无法识别Element.Element_ID)。 - 第二种写法更新所有行:因为EXISTS子查询没有和外层Line表做关联匹配,比如只写了
WHERE Name = 'c18',没有添加Element.Element_ID = Line.Element_ID的条件。此时只要Element表存在Name为'c18'的行,子查询就会返回true,导致所有Line表的行都被更新。
额外说明(适用于SQLite 3.33.0+)
如果你的SQLite版本在3.33.0及以上,其实支持UPDATE结合JOIN的写法,代码更直观:
UPDATE Line SET length = 2 FROM Element WHERE Line.Element_ID = Element.Element_ID AND Element.Name = 'c18';
内容的提问来源于stack exchange,提问作者Åsmund Sælen
相关产品推荐
相关产品推荐

