简体   繁体   English

MySQL插入子查询选择

[英]MySQL insert into with subquery Select

Basically, I'd like to insert into table, getting values id from the same table,something like this 基本上,我想插入表中,从同一个表中获取值id,就像这样

$sql = ("INSERT INTO commande (idfichecmd,idproduit,idclt,qte,datecmd)
(SELECT MAX(idfichecmd)+1 ,'1' AS idproduit ,'$idC' AS idclt ,'$fb' AS qte,'$date' FROM commande),
(SELECT MAX(idfichecmd) ,'2' AS idproduit ,'$idC' AS idclt ,'$g' AS qte,'$date' FROM commande),
(SELECT MAX(idfichecmd) ,'3' AS idproduit ,'$idC' AS idclt ,'$pi' AS qte,'$date' FROM commande),
(SELECT MAX(idfichecmd) ,'4' AS idproduit ,'$idC' AS idclt ,'$ft' AS qte,'$date' FROM commande),
(SELECT MAX(idfichecmd) ,'5' AS idproduit ,'$idC' AS idclt ,'$sd' AS qte,'$date' FROM commande),
(SELECT MAX(idfichecmd) ,'6' AS idproduit ,'$idC' AS idclt ,'$ad' AS qte,'$date' FROM commande),
(SELECT MAX(idfichecmd) ,'7' AS idproduit ,'$idC' AS idclt ,'$vs' AS qte,'$date' FROM commande),
(SELECT MAX(idfichecmd) ,'8' AS idproduit ,'$idC' AS idclt ,'$wi' AS qte,'$date' FROM commande),
(SELECT MAX(idfichecmd) ,'9' AS idproduit ,'$idC' AS idclt ,'$equip' AS qte,'$date' FROM commande),
(SELECT MAX(idfichecmd) ,'10' AS idproduit ,'$idC' AS idclt ,'$fo' AS qte,'$date' FROM commande),
(SELECT MAX(idfichecmd) ,'11' AS idproduit ,'$idC' AS idclt ,'$fh' AS qte,'$date' FROM commande)")or die(mysql_error());
$result = mysql_query($sql) or die("Unable to add commande : ". mysql_error());   
mysql_close();

owever, this one does not work, anyone know why? 但是,这一项不起作用,有人知道为什么吗?

You could use UNION : 可以使用UNION

INSERT INTO commande (idfichecmd, idproduit, idclt, qte, datecmd)
  SELECT MAX(idfichecmd)+1,  1, '$idC', '$fb'   , '$date' FROM commande
UNION ALL
  SELECT MAX(idfichecmd)  ,  2, '$idC', '$g'    , '$date' FROM commande
UNION ALL
  SELECT MAX(idfichecmd)  ,  3, '$idC', '$pi'   , '$date' FROM commande
UNION ALL
  SELECT MAX(idfichecmd)  ,  4, '$idC', '$ft'   , '$date' FROM commande
UNION ALL
  SELECT MAX(idfichecmd)  ,  5, '$idC', '$sd'   , '$date' FROM commande
UNION ALL
  SELECT MAX(idfichecmd)  ,  6, '$idC', '$ad'   , '$date' FROM commande
UNION ALL
  SELECT MAX(idfichecmd)  ,  7, '$idC', '$vs'   , '$date' FROM commande
UNION ALL
  SELECT MAX(idfichecmd)  ,  8, '$idC', '$wi'   , '$date' FROM commande
UNION ALL
  SELECT MAX(idfichecmd)  ,  9, '$idC', '$equip', '$date' FROM commande
UNION ALL
  SELECT MAX(idfichecmd)  , 10, '$idC', '$fo'   , '$date' FROM commande
UNION ALL
  SELECT MAX(idfichecmd)  , 11, '$idC', '$fh'   , '$date' FROM commande

But it might be easier to first obtain the MAX(idfichecmd) in PHP, then use INSERT ... VALUES (remembering to perform the operation in a transaction in order to preserve atomicity): 但是,首先在PHP中获取MAX(idfichecmd) ,然后使用INSERT ... VALUES (记住要在事务中执行操作以保持原子性)可能会更容易:

INSERT INTO commande (idfichecmd, idproduit, idclut, qte, datecmd) VALUES
  ($id+1, 1, '$idC', '$fb', '$date'),
  ($id  , 2, '$idC', '$g' , '$date'),
  -- etc.

Or, if you are merely looking to give each new record an incremented idfichecmd , consider making the column AUTO_INCREMENT (whereby MySQL will do all of this for you automatically): 或者,如果您只是希望为每个新记录idfichecmd一个递增的idfichecmd ,请考虑将列idfichecmd AUTO_INCREMENT (这样MySQL将自动为您完成所有这些操作):

ALTER TABLE commande MODIFY idfichecmd INT AUTO_INCREMENT;
INSERT INTO commande (idproduit, idclut, qte, datecmd) VALUES
  (1, '$idC', '$fb', '$date'),
  (2, '$idC', '$g' , '$date'),
  -- etc.

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM