为何无法在SQL中通过SELECT语句向Assembly表执行INSERT操作?
问题原因及解决方法
你的代码存在两个核心问题,导致无法正常运行:
1. INSERT语法使用错误
INSERT ... VALUES是用来插入常量值列表的语法,不能直接嵌套SELECT查询语句。如果要基于现有表的查询结果插入数据,应该直接使用INSERT ... SELECT的结构,不需要VALUES关键字。但更关键的是——你实际需求是更新已有行的checksum值,而非插入新行。
2. 主键逻辑冲突
你的表主键是(AssemblyID, Part),这两个字段的组合不允许重复。如果执行你写的INSERT语句,数据库会尝试插入新行,但未指定AssemblyID和Part的值,这两个主键字段会被设为NULL(但主键不允许NULL);就算能赋值,原有行的主键组合已经存在,也会触发主键重复的错误。
正确写法1:用UPDATE更新已有行的checksum
如果要给已存在的行计算并填充checksum,应该使用UPDATE语句:
UPDATE Assembly SET checksum = CHECKSUM(AssemblyID, Part);
正确写法2:初始插入时直接生成checksum
如果想在插入数据时就同步生成checksum,可以一步完成,无需分开操作:
INSERT INTO Assembly (AssemblyID, Part, checksum) VALUES (1001, 'Bolt', CHECKSUM(1001, 'Bolt')), (1001, 'Screw', CHECKSUM(1001, 'Screw')), (2002, 'Nut', CHECKSUM(2002, 'Nut')), (2002, 'Washer', CHECKSUM(2002, 'Washer')), (3003, 'Toggle', CHECKSUM(3003, 'Toggle')), (3003, 'Bolt', CHECKSUM(3003, 'Bolt'));
额外优化:用计算列自动维护checksum
如果希望checksum能随AssemblyID或Part的变化自动更新,无需手动维护,可以将checksum设为持久化计算列:
CREATE TABLE Assembly ( AssemblyID INTEGER, Part VARCHAR(100), checksum AS CHECKSUM(AssemblyID, Part) PERSISTED, PRIMARY KEY (AssemblyID, Part) );
这样每次AssemblyID或Part修改时,checksum会自动重新计算,彻底省去手动维护的步骤。
内容的提问来源于stack exchange,提问作者mikey22022
相关产品推荐
相关产品推荐

