这条INSERT INTO SQL语句存在什么语法错误?报错‘from关键字附近语法不正确’
SQL语句报错分析:Incorrect syntax near the keyword 'from'
错误SQL语句
insert into Transaction_Details (Trans_Date, Trans_Type) values (GetDate(), 'WITHDRWAL') from Transaction_Details t inner join Acc_Details a on t.UserID = a.UderId where a.Card_No = '1234567890123456';
涉及表结构
Transaction_Details表
Trans_ID int PRIMARY KEY IDENTITY(1,1), Trans_Date datetime, Trans_Type varchar(20), UserID int foreign key references User_Details(UserID), Card_Id varchar(16) foreign key references User_Card_Details, Acc_No int foreign key references Acc_Details(Acc_No)
Acc_Details表
Acc_Id int, Acc_No int PRIMARY KEY, Card_No varchar(16) foreign key references User_Card_Details(Card_No), UserId int foreign key references User_Details(UserID), Balance int, BankName varchar(15)
报错信息
Incorrect syntax near the keyword 'from'
错误分析及修正建议
- 核心语法错误:INSERT语句同时混用了
VALUES子句和FROM子句,这违反SQL语法规范。INSERT仅支持两种合法写法:要么用VALUES直接插入常量值,要么用INSERT...SELECT从查询结果提取数据插入,两者不能同时使用。你的需求是基于Acc_Details的查询结果插入数据,应采用INSERT...SELECT写法,删除VALUES部分。 - 拼写错误:
- 交易类型值
'WITHDRWAL'拼写错误,正确应为'WITHDRAWAL'(缺少字母A)。 - 连接条件中的
a.UderId拼写错误,对应Acc_Details表的字段是UserId,需改为a.UserId。
- 交易类型值
- 必填字段缺失:Transaction_Details表中的
UserID、Card_Id、Acc_No是外键字段且未设置允许为空,原语句仅插入Trans_Date和Trans_Type,即便修复语法也会因字段缺失报错,需补充这些字段的取值。
修正后的示例SQL
insert into Transaction_Details (Trans_Date, Trans_Type, UserID, Card_Id, Acc_No) select GetDate(), 'WITHDRAWAL', a.UserId, a.Card_No, a.Acc_No from Acc_Details a where a.Card_No = '1234567890123456';
(注:移除了与Transaction_Details的关联,因为插入新交易无需关联已有交易记录,直接从Acc_Details获取用户、卡号、账户信息即可)
内容的提问来源于stack exchange,提问作者Varun Gupta
相关产品推荐
相关产品推荐

