如何编写SQL语句向cms_objects_channels表插入符合指定规则的新行
正确SQL实现
INSERT INTO hotres_panel.cms_objects_channels ( id_objects, id_channels, contract_date, contract_amount, params, status, hotel_id, active ) SELECT id AS id_objects, 8 AS id_channels, DATE_ADD(CURDATE(), INTERVAL 6 MONTH) AS contract_date, 1000 AS contract_amount, CONCAT('hotel_id=', id) AS params, 'new' AS status, id AS hotel_id, 1 AS active FROM hotres_panel.cms_objects WHERE category_id IN (175, 176, 217, 180, 178, 218, 196) AND active = 1 AND test = 0 AND contract_date >= CURDATE();
原SQL存在的问题
- 语法结构错误:批量从其他表查询插入需要用
INSERT ... SELECT结构,不能混用WHERE和VALUES关键字,VALUES仅适用于插入固定值行的场景 - 分类筛选逻辑错误:
category_id = 175 OR 176 OR ...的写法不符合SQL语法规则,实际执行会返回全表符合其他条件的行,需改用IN关键字匹配多个分类ID - 日期计算不符合要求:当前日期加6个月需用
DATE_ADD(CURDATE(), INTERVAL 6 MONTH)实现,原写法CONCAT(CURDATE())无实际意义 - 动态字段拼接错误:
params字段需要拼接固定前缀和ID值,使用CONCAT函数即可直接生成符合要求的字符串 - 原示例代码中
'hotel_id=123'和'new'之间缺少逗号,会触发语法报错
内容的提问来源于stack exchange,提问作者buhh1231
相关产品推荐
相关产品推荐

