0

我正在使用 Laravel PHP 框架的 Fluent 查询构建器将行从一个表移动到另一个表。正在使用 PDO。使用原始查询DB::query()时,出现错误:

错误

SQLSTATE[21S01]: Insert value list does not match column list: 
1136 Column count doesn't match value count at row 1

SQL: INSERT IGNORE into listings_archive VALUES (?, ?)

询问

// Get rows from first table
$rows = DB::table('table_1')
        ->where('id', '>', '12345')
        ->get();

// Copy rows to second table
foreach($rows as $row) {
    $listing = get_object_vars($row);
    DB::query('INSERT IGNORE into table_2 VALUES (?, ?)', $row);
}

$row 的 var_dump

array(39) {
    ["id"]=>
    string(7) "2511877"
    ["name"]=>
    string(2) "AB"
    ["color"]=>
    NULL
    ["type"]=>
    NULL
    ...

是什么导致了错误,如何解决?我尝试使用NULLs 删除元素,但仍然得到相同的错误!


更新

这可能是数组被传递到DB::query(). 这些非常简单的示例给出了类似的错误:

$row = array('id', 123);
DB::query('INSERT IGNORE into table_2 VALUES (?, ?)', $row);

$row = array('id' => 123);
DB::query('INSERT IGNORE into table_2 VALUES (?, ?)', $row);

错误

SQLSTATE[21S01]: Insert value list does not match column list: 
1136 Column count doesn't match value count at row 1
4

2 回答 2

0

那么列数与值的数量不匹配。如果您不指定哪些列,则默认为全部,因此您需要类似

Insert IGNORE into table_2(Column1,Column2) Values (?, ?)

Column1, Column2,是 table_2 中您要将 Table_1 中的值放入的两列的名称。

于 2012-09-27T15:14:51.977 回答
0

有相同的错误消息,但我在 php 中使用了 mysqli

  • 基本上如上所述,如果表的结构不同,你必须命名字段

通过一些修修补补解决:

$stmt = $con->prepare("INSERT INTO table2
                              (field1, field2, ..., )
                              SELECT
                              field1, field2, ..., 
                              FROM
                              table1 WHERE field = ? ");
于 2013-12-05T11:20:34.577 回答