除了字段之外,我必须对INSERT
完全相同的行执行多个 s,该recipient
字段的值对于每一行都不同。for/each
没有在 PHP 中INSERT
对同一行执行循环但recipient
在每次迭代中更改字段,有没有办法在 MySQL 中更有效地解决这个问题?
3 回答
我认为您可以在 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;
我认为您需要仔细阅读此处的链接。您可以同时插入多行,这将使重用变量变得非常容易:
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。这涉及到很多行管理,如果你经常这样做,你会损害你的性能,除非你根本无法使用任何其他语法。
你有几个选择。但是,您是否会获得效率是您必须进行基准测试的事情。
方法1:首先在一个批次中插入所有行,然后在第二个循环上运行更新查询。
我不喜欢这种方法,因为尝试运行第二组更新查询会降低效率。
但是由于您将使用 PHP 来运行查询,所以我建议使用方法 2。
方法二:
构建一个字符串以包含多个插入值。
插入 MyTable (Field1, Field2, ... Field-N) 值 (Value1, Value2, Value3, ... Value-N), (Value1, Value2, Value3, ... Value-N), (Value1, Value2 , 值 3, ... 值-N)
您可以在此处将字符串构建为相当大的大小。我过去已经为 10,000 条记录构建了它。
通过调用mysql_query函数执行查询。
返回第 1 步,直到没有更多记录要插入。
如果您有大量插入,此方法非常好。但重要的是要记住,必须捕获插入中的失败以确保插入正确的记录。理想情况下,事务提交将与mysql_affected_rows函数一起帮助解决这个问题。
最后,如果您的数字不是那么好,请构建一个较小的字符串。如果您的总记录只有大约 50 条左右,只需将它们单独插入即可。