我在这里所做的是将报价转换为采购订单,这只是我用来执行此操作的查询之一。 router
的主键是RN
,该表中的唯一键是Line Order
。我使用Line Order
来允许用户定义router
中的行顺序。由于 RN
设置为 auto_increment 我不必担心这一点。问题是行顺序
在路由器
上。我从 rfq_operations
选择多行插入到 router
中,但它为所有行提供了相同的 Line Order
值,我需要它们增加 1来自 MAX(router.Line Order)
INSERT INTO `router`(`Work Order`, `Line Order`, `Estimated Time`,`Estimated Time Unit`, `Work Center`, `Work Description`, `Work Instruction`)
SELECT ?,(SELECT 1+IFNULL(MAX(`Line Order`),1) FROM `router`),CEIL(((`rfq_operations`.`Program Time`+`rfq_operations`.`Setup Time`+(`rfq_operations`.`Run Time`*(?/`rfq_operations`.`Conversion`)))/60))
,'Hours',`rfq_operations`.`Work Center`,`workcenter`.`Information`,`rfq_operations`.`Instructions`
FROM `rfq_operations`
LEFT JOIN `workcenter`
ON `rfq_operations`.`Work Center`=`workcenter`.`RN`
WHERE `rfq_operations`.`RFQ Line`=?
ORDER BY `rfq_operations`.`Line Order`
最佳答案
运行select
查询,然后将结果插入到最终表中。所以,你只能得到一个值。在选择
期间您看不到表格的更改。
无论如何,您都可以使用变量做您想做的事情。您的查询有点复杂,但想法如下:
insert into router(col1, . . .)
select (@rn := @rn + 1), . . .
from . . . cross join
(select @rn := coalesce(max(`Line Order`), 0) from router) vars;
这会将@rn
变量初始化为最大值。然后它为子查询中的每一行递增它。
也就是说,正确的做法是为此设置一个自动递增键。只需将Line Order
定义为自动递增主键,数据库就会为您递增值。
关于MySQL 使用 from select 语句插入行,同时递增用户可定义的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28157153/