MySQL返回错误的插入ID

时间:2017-03-25 21:32:40

标签: php mysql

我在PHP中运行此SQL语句,将所有列中的数据从“other”复制到“table”(表和其他列都具有相同的列名)

    $x=mysqli_query($conn,"INSERT INTO table SELECT * from other WHERE item_id='33'");
    $nid=mysqli_insert_id($conn);

我希望$ nid能够从它刚刚插入的“table”中获得新的ID,而是返回“33”,这是另一个表的ID来源。

也许它复制了包括其他表中的ID在内的所有内容并返回了该内容?

有人知道为什么或如何解决?

由于

1 个答案:

答案 0 :(得分:-1)

由于两个表的列名相同,因此insert设置了 id 以及所有其他字段。

要避免从other选择除item_id

以外的所有字段

您可以静态编写查询中的所有列名称(除了一个)以代替*,或者您可以使用初步查询以dinamically方式构建列列表:

// Get all columns names except one
// as comma separated list
// Column names are bacltick quoted

$result = $conn->query( 
    "SELECT `COLUMN_NAME` "
  . "FROM `INFORMATION_SCHEMA`.`COLUMNS` " 
  . "WHERE `TABLE_SCHEMA`='your_db_name' " // DB name here
  . "AND `TABLE_NAME`='other' "            // TABLE name here
  . "AND `COLUMN_NAME` != 'item_id'" );    // EXCLUDED column here

if( ! $result )
{
    // HANDLE EXCEPTION
}

$columns = $result->fetch_all();

foreach( $columns as &$c )
{
    $c = '`' . $c[ 0 ] . '`';
}

$columns = implode( ',', $columns );


// Perform the copy

$x = mysqli_query( $conn, "INSERT INTO `table` SELECT $columns from `other` WHERE item_id='33'");
$nid = mysqli_insert_id( $conn );

附注:如果您的目标表名称为table必须在反引号`table`之间进行转义。