我不认为 Zend_Db 支持插入多行。
但是,如果您只有两行或更多行,则可以使用循环。
foreach ($data as $row)
{
$db->insert('table', $row)
}
前 Zend Framework 开发人员
Bill Karwin 前段时间在 Nabble 上写了这个:
行集基本上是一个集合对象,因此我将向该类添加方法以允许将行添加到集合中。所以你应该能够做到这一点:
// creates a rowset collection with zero rows
$rowset = $table->createRowset();
// creates one row with unset values
$row = $table->createRow();
// adds one row to the rowset
$rowset->addRow($row);
// iterates over the set of rows, calling save() on each row
$rowset->save();
将整数传递给 createRowset() 以创建 N 个空行是没有意义的。无论如何,您只需要遍历它们即可使用值填充它们。因此,您不妨编写一个循环来使用应用程序数据创建和填充各个行,然后将它们添加到集合中。
$rowset = $table->createRowset();
foreach ($appData as $tuple)
{
$row = $table->createRow($tuple);
$rowset->addRow($row);
}
$rowset->save();
允许将数组数组传递给 createRowset() 确实有意义,因为这与将元组传递给 createRow() 的用法一致。
$rowset = $table->createRowset($appData); // pass array of tuples
这将执行与上一个示例相同的循环(除了最后的 save() 之外),创建一个新行的新行集,准备好进行 save()d。
SQL中有两种方法可以提高插入数据的效率:
使用包含多行的单个 INSERT 语句:
插入 t (col1, col2, col3) 值 (1, 2, 3), (4, 5, 6), (7, 8, 9);
准备一个 INSERT 语句并多次执行:
准备插入到 t (col1, col2, col3) 值 (?, ?, ?); 执行 1、2、3 执行 4、5、6 执行 7、8、9
但是,支持这些改进中的任何一个都会增加 Row 和 Rowset 类的复杂性。这是由于当前 Zend_Db_Table_Row 类在调用 save() 时区分需要插入或更新的行的内部方式。这种区别由 Row 对象封装,因此 Rowset 不知道各个行是新行还是现有行的修改副本。因此,为了让 Rowset 类提供使用更高效 SQL 的多行 save() 方法,脏数据的管理必须完全重构。更简单的解决方案是让 Rowset 遍历其行,对每一行调用 save()。这对于 OO 封装更好,尽管它无助于优化 SQL 以插入行集。
无论如何,当最需要高效的 SQL 时,在典型的 Web 请求中批量加载多行数据确实很少见。少量行的效率差异很小,因此只有在批量加载大量行时才会有明显的改进。如果是这种情况,您无论如何都不应该使用 INSERT,您应该使用 MySQL 的 LOAD DATA 语句,或者如果您使用其他 RDBMS 品牌,则应该使用等效功能。INSERT 通常不是加载大量数据的最有效选择。
关于返回自动生成的密钥,我不会打扰。请注意,如果您使用纯 SQL(例如在 mysql CLI 中),并且在单个 INSERT 语句中插入多行,则只能获取最后生成的 id 值,而不是插入的所有行的 id 值。这是 SQL 行为;对于任何语言或任何框架都是如此。
INSERT INTO t (col1, col2, col3) VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9);
SELECT LAST_INSERT_ID(); -- returns only the id for the third tuple
如果您确实需要每一行的 id,您应该编写一个循环并一次插入一行,在插入每一行后检索生成的 id。