1

跳到问题底部的“我的代码”,直奔主题。


$con = mysql_connect('localhost', 'mysql_user', 'mysql_password');


一般示例:

可以在单个 中执行多个查询字符串mysql_query,如下所示...

mysql_query("
    INSERT INTO table_one (a,b,c) VALUES (1,2,3);
    INSERT INTO table_two (x,y,z) VALUES (7,8,'a text value');
    ", $con);

可以向每个查询字符串添加多行,如下所示...

mysql_query("
    INSERT INTO table_one (a,b,c) VALUES (1,2,3), (2,3,1), (3,1,2);
    INSERT INTO table_two (x,y,z) VALUES (7,8,9), (8,9,7), (9,7,8);
    ", $con);

有一个值数组,像这样......

$array(
  [0] => array(1,2,3),
  [1] => array(2,'text',1),
  [2] => array(3,1,2)
);

...可以使用循环动态创建查询字符串,如下所示...

$a = "INSERT INTO table_one (a,b,c) VALUES ";
foreach($array as $val){
  $a .= "(". implode(",",$val) ."),";
}
$a = trim($a, ",") . ";";

问题:

如何编写执行多个 INSERT 查询字符串的单个 MySQL 查询,每个查询字符串都有多行,以便第二个查询字符串插入的每一行都可以引用第一个查询字符串插入的相应行。因此$var,在这个片段中将对应于第一个 INSERT 的 auto_increment 行 ID。

mysql_query("
    INSERT INTO table_one (a,b,c) VALUES (1,2,3), (2,3,1), (3,1,2);
    INSERT INTO table_two (x,y,z) VALUES ($var,8,9), ($var,9,7), ($var,7,8);
    ", $con);

我的代码:

这是我的代码的简化版本...

$q1 = "INSERT INTO `table_one` (t1c1,t1c2) VALUES ";
$q2 = "INSERT INTO `table_two` (t2c1,t2c2,t2c3) VALUES ";

foreach($array as $item){
  $q1 .= "('". $item ."','blah'),";
  $q2 .= "('". $row_ID_from_first_insert ."','something','whatever'),";
}

$q1 = trim($q1,",") .";";
$q2 = trim($q2,",") .";";
$q = $q1.$q2;

mysql_query($q, $this->connect);

什么是安全的生成方式$row_ID_from_first_insert

据我了解LAST_INSERT_ID(),在查询字符串中使用将不起作用,因为当使用单个查询字符串插入多行时,它仅返回第一个插入的行 ID。在 foreach 循环中使用LAST_INSERT_ID()+1where1替换为增量变量是否安全?如果来自不同用户的多个提交同时发生怎么办?

4

2 回答 2

2

通常,您必须取回id插入行的值。除非您可以创建另一个密钥来代替可以提前通过程序生成的密钥。

虽然INSERT多行语句的速度明显更快,但您付出的代价是缺乏精确度。如果您的id值是按顺序发出的,这是默认行为,那么您可以合理地确定LAST_INSERT_ID()代表插入的第一行的 ID,因此您可以使用您建议的方法计算行的 ID,尽管从索引开始0。

请记住,多次提交不会影响LAST_INSERT_ID()结果,因为此值是每个连接的。仅当您对同一数据库句柄执行后续查询时,它才会更改。其他请求中的操作不会影响它。

集群或多主数据库可能会发出非顺序标识符,在这种情况下这将不起作用。INSERT IGNORE在实际插入的行数可能少于提供的行数的情况下,这也是不可靠的。

于 2012-10-24T21:56:12.270 回答
0

LAST_INSERT_ID() 是在来自同一连接句柄的每个成功查询结束时生成的。因此,您的示例代码不会为您提供您正在寻找的结果。见下文:

mysql_query("
    INSERT INTO table_two (x,y,z) VALUES (LAST_INSERT_ID(),8,9), (LAST_INSERT_ID(),9,7), (LAST_INSERT_ID(),7,8);
", $con);

上面的结果将是(其中 x 是 LAST_INSERT_ID() 产生的值):

 x    y    z
 5    8    9
 5    9    7
 5    7    8

要接收您寻求的结果,使用您在示例中使用的相同格式(我不建议您使用 sql 注入的风险 - 改用 mysqli),您可以这样做:

 mysql_query("
    INSERT INTO table_two (x,y,z) VALUES (LAST_INSERT_ID(),8,9);
    INSERT INTO table_two (x,y,z) VALUES (LAST_INSERT_ID(),9,7);
    INSERT INTO table_two (x,y,z) VALUES (LAST_INSERT_ID(),7,8); 
", $con);

这将为您提供(其中 x 是 LAST_INSERT_ID() 产生的值):

 x    y    z
 5    8    9
 6    9    7
 7    7    8
于 2016-10-29T18:30:48.603 回答