Mysql 将数据插入表时发生SQL错误
我试图在Postgres中执行以下查询:-Mysql 将数据插入表时发生SQL错误,mysql,sql,postgresql,Mysql,Sql,Postgresql,我试图在Postgres中执行以下查询:- INSERT INTO customer_specific_price (id, user_id, model_map_id , start_date , price_model_id,precedence ) SELECT coalesce(MAX(csp.id), 0)+1 , cp.user_id, eipm.id , pipt.start_date, pipt.price_model_id , pi.
INSERT INTO customer_specific_price (id, user_id, model_map_id , start_date ,
price_model_id,precedence )
SELECT coalesce(MAX(csp.id), 0)+1 , cp.user_id, eipm.id , pipt.start_date,
pipt.price_model_id , pi.precedence
FROM customer_specific_price csp, customer_price cp, plan_item pi ,
plan_item_price_timeline pipt , entity_item_price_map eipm
WHERE cp.plan_item_id = pi.id and pipt.plan_item_id = cp.plan_item_id and
pi.plan_id is Null and pi.item_id = eipm.item_id
这是一个错误
错误:列cp.user\u id必须出现在GROUP BY子句中,或在聚合函数中使用
当表不包含任何id列时,它工作正常。但是当我添加id并使用coalesceMAXcsp.id时,0+1给出了上面提到的错误。您的查询中有一个潜在错误,这一部分:
coalesce(MAX(csp.id), 0)+1
可能会在结果行中放置错误的意外值我没有检查整个查询,加上您没有显示表结构,因此我不想做任何其他假设:如果子选择返回多个结果,那么所有这些结果对该列都具有相同的值
我猜您需要autoincrement列中的最后一个id,否则如果源表中的行可以删除,那么目标表中可能会有id冲突,假设所有这些id都是PKs:如果是这样,请不要使用group函数,而是使用子查询,如SELECT id from cps ORDER BY id DESC LIMIT 1 UNTESTESTED,这只是一个建议
除此之外,我认为您最好重新思考您试图实现的目标,然后您可能会编写一个不同的查询。因此,当您添加id并使用coalesceMAXcsp.id,0+1时,您会收到错误消息error:column cp.user_id必须出现在GROUP BY子句中或在聚合函数中使用。这是因为在您的例子中,一旦引入聚合函数MAX,其他列也应该包含聚合函数MAX、SUM、COUNT等,或者它们应该用于在查询结束时使用GROUP BY子句进行分组。这是一个简短的指导小组
因此,您的查询可以通过其他列重写为group,如下所示:
INSERT INTO customer_specific_price (id, user_id, model_map_id , start_date ,
price_model_id,precedence )
SELECT coalesce(MAX(csp.id), 0)+1 , cp.user_id, eipm.id , pipt.start_date,
pipt.price_model_id , pi.precedence
FROM customer_specific_price csp, customer_price cp, plan_item pi ,
plan_item_price_timeline pipt , entity_item_price_map eipm
WHERE cp.plan_item_id = pi.id and pipt.plan_item_id = cp.plan_item_id and
pi.plan_id is Null and pi.item_id = eipm.item_id
GROUP BY cp.user_id, eipm.id, pipt.start_date, pipt.price_model_id, pi.precedence;
我们可以把它的格式设置得稍微好一点吗?当必须左右滚动时,很难读取所有的查询。按照错误消息所说的做,您还有很多其他未分组和未聚合的列。这是Postgres,不是MySQL及其对GroupBy的扩展。可能结果不会像预期的那样快,但在尝试插入之前,您应该先获得此选择工作。