2

除了字段之外,我必须对INSERT完全相同的行执行多个 s,该recipient字段的值对于每一行都不同。for/each没有在 PHP 中INSERT对同一行执行循环但recipient在每次迭代中更改字段,有没有办法在 MySQL 中更有效地解决这个问题?

4

3 回答 3

1

我认为您可以在 MySQL 中编写一个stored procedure使用单个查询调用在同一个表上进行多次插入。例如

CREATE PROCEDURE sp_insert_data
(
 arg_col VARCHAR(255)
,arg_recipient_val_1 VARCHAR(255)
,arg_recipient_val_2 VARCHAR(255)
)
BEGIN
    INSERT INTO my_table(col, recipient)
    VALUES(arg_col, arg_recipient_val_1),
          (arg_col, arg_recipient_val_2);
END;
于 2012-07-31T07:28:30.430 回答
1

我认为您需要仔细阅读此处的链接。您可以同时插入多行,这将使重用变量变得非常容易:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

有很多技巧可以做。

  • 首先,锁定表以加快插入过程。
  • 其次,您可以使用多插入语法快速插入行。

SQL 代码示例如下。

LOCK TABLES a WRITE;
INSERT INTO a VALUES (1,23),(2,34),(4,33);
INSERT INTO a VALUES (8,26),(6,29);
...
UNLOCK TABLES;

在 SQL 效率方面,甚至不看替换成语法。

请注意,REPLACE INTO 的执行速度比 UPDATE 语句慢得多。请记住,REPLACE INTO 需要对键进行测试,如果在任何或所有列上找到匹配的唯一键,则执行 DELETE FROM,然后执行 INSERT。这涉及到很多行管理,如果你经常这样做,你会损害你的性能,除非你根本无法使用任何其他语法。

于 2012-07-31T07:29:16.223 回答
1

你有几个选择。但是,您是否会获得效率是您必须进行基准测试的事情。

方法1:首先在一个批次中插入所有行,然后在第二个循环上运行更新查询。

我不喜欢这种方法,因为尝试运行第二组更新查询会降低效率。

但是由于您将使用 PHP 来运行查询,所以我建议使用方法 2。

方法二:

  1. 构建一个字符串以包含多个插入值。

    插入 MyTable (Field1, Field2, ... Field-N) 值 (Value1, Value2, Value3, ... Value-N), (Value1, Value2, Value3, ... Value-N), (Value1, Value2 , 值 3, ... 值-N)

    您可以在此处将字符串构建为相当大的大小。我过去已经为 10,000 条记录构建了它。

  2. 通过调用mysql_query函数执行查询。

  3. 返回第 1 步,直到没有更多记录要插入。

如果您有大量插入,此方法非常好。但重要的是要记住,必须捕获插入中的失败以确保插入正确的记录理想情况下,事务提交将与mysql_affected_rows函数一起帮助解决这个问题。

最后,如果您的数字不是那么好,请构建一个较小的字符串。如果您的总记录只有大约 50 条左右,只需将它们单独插入即可。

于 2012-07-31T07:38:02.803 回答