【问题标题】:Moving a row from one table to another (Insert value list does not match column list)将一行从一个表移动到另一个表(插入值列表与列列表不匹配)
【发布时间】:2012-09-19 10:10:14
【问题描述】:

我正在使用 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

【问题讨论】:

    标签: php mysql pdo laravel


    【解决方案1】:

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

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

    Column1, Column2, 是table_2中你想把Table_1中的值放入的两列的名称。

    【讨论】:

    • 可能是传入DB::query() 的数组有问题。我尝试了一个简单的示例,但仍然无法正常工作
    • 啊,这意味着您将不得不从 $row 构造一个数组。为什么您不只是使用一条 sql 语句而不是使用 PHP 作为中间人,有什么特别的原因吗?
    • 谢谢,我注意到了这个问题。文档 (laravel.com/docs/database/raw) 中所述函数的用法有语法错误,应该像您建议的那样包含列。
    • 您的意思是直接将行从table_1 移动到table_2?如果是这样,应该如何只使用 MySQL 来完成?
    • 确定基本形式是Insert Into Table1(Column1,Column2) Select OtherColumn1, OtherColumn2 From Table2。如果您需要更复杂的东西,例如跳过现有值。问另一个问题并提供表模式并提及 waht 构成现有记录
    【解决方案2】:

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

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

    通过一些修修补补解决:

    $stmt = $con->prepare("INSERT INTO table2
                                  (field1, field2, ..., )
                                  SELECT
                                  field1, field2, ..., 
                                  FROM
                                  table1 WHERE field = ? ");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多