MySQL INSERT报1064(42000)错误,无反引号却提示反引号问题
MySQL INSERT语句语法错误排查
错误根源不是反引号,是你在VALUES子句中使用的子查询没有用括号包裹。MySQL规定,当在VALUES里嵌入返回单个值的子查询时,必须将每个子查询放在一对圆括号中,否则解析器会把SELECT当成语法错误的起始部分。
修正后的SQL语句
INSERT INTO users ( user_ref_id, user_contact_info_id, user_secure_password, user_role_id, user_status_id ) VALUES ( UUID(), (SELECT ci.contact_info_id FROM contact_info ci WHERE ci.contact_info_email = 'admin@example.com'), '12345', (SELECT r.role_id FROM roles r WHERE r.role_label = 'ADMIN'), (SELECT us.user_status_id FROM user_statuses us WHERE us.user_status_label = 'ACTIVATED') );
额外建议
需要确认这些子查询都能返回且仅返回一行结果,否则会触发Subquery returns more than 1 row的错误。如果需要处理多行场景,或想让语句更清晰,建议改用INSERT...SELECT语法:
INSERT INTO users ( user_ref_id, user_contact_info_id, user_secure_password, user_role_id, user_status_id ) SELECT UUID(), ci.contact_info_id, '12345', r.role_id, us.user_status_id FROM contact_info ci CROSS JOIN roles r CROSS JOIN user_statuses us WHERE ci.contact_info_email = 'admin@example.com' AND r.role_label = 'ADMIN' AND us.user_status_label = 'ACTIVATED';
这种写法既避免了子查询嵌套的语法问题,也能确保只有当所有关联条件匹配时才插入数据。
内容的提问来源于stack exchange,提问作者hotmeatballsoup
相关产品推荐
相关产品推荐

