MySQL使用select语句插入行,同时递增用户可定义的顺序

时间:2015-01-26 19:18:36

标签: mysql mysqli

我在这里做的是将报价转换为PO,这只是我用来执行此操作的查询之一。 router的主键是RN,此表中的唯一键是Line Order。我正在使用Line Order来允许用户定义router中行的顺序。由于RN设置为auto_increment,我不必担心。问题是Line Order  在router上。我从rfq_operations选择了多行以插入router,但它为所有行提供了相同的Line Order值,我需要它们从MAX(router.Line Order)增加1

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`

1 个答案:

答案 0 :(得分:1)

运行select查询,然后将结果插入到最终表中。所以,你只得到一个价值。在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定义为自动递增主键,数据库就会为您增加值。